重叠的多列统计数据是多余的吗?

Mar*_*lli 1 sql-server-2005 sql-server optimization statistics

我运行了一个数据库引擎优化顾问会话DTA 来优化我的数据库。

DTA 提出了一些统计建议,但是,我注意到有些包含在其他中,例如在我下面的表 ProductIcon 中:

    CREATE STATISTICS [_dta_stat_172123954_1_2_3_4_5_12] 
ON [dbo].[ProductIcon]
([ClassID], [SegmentID], [GroupID], [Tier1], [LanguageID], [Active])
    go

    CREATE STATISTICS [_dta_stat_172123954_11_1_2_3_4_5_12] 
ON [dbo].[ProductIcon]
([IconTypeID], [ClassID], [SegmentID], [GroupID], [Tier1], [LanguageID], [Active])
    go
Run Code Online (Sandbox Code Playgroud)

这是表定义:

    IF OBJECT_ID('[dbo].[ProductIcon]') IS NOT NULL 
    DROP TABLE [dbo].[ProductIcon] 
    GO
    CREATE TABLE [dbo].[ProductIcon] ( 
    [ClassID]      INT                              NOT NULL,
    [SegmentID]    INT                              NOT NULL,
    [GroupID]      INT                              NOT NULL,
    [Tier1]        VARCHAR(10)                      NOT NULL,
    [LanguageID]   SMALLINT                         NOT NULL  CONSTRAINT [DF_ProductIcon_LanguageID] DEFAULT ((1)),
    [Image]        VARCHAR(50)                      NOT NULL  CONSTRAINT [DF_ProductIcon_Image] DEFAULT (''),
    [Descr]        VARCHAR(100)                     NOT NULL  CONSTRAINT [DF_ProductIcon_Descr] DEFAULT (''),
    [SortOrder]    INT                              NOT NULL  CONSTRAINT [DF__ProductIc__SortO__6A358A53] DEFAULT ((1)),
    [URL]          NVARCHAR(512)                        NULL,
    [LinkJSClick]  NVARCHAR(512)                        NULL,
    [IconTypeID]   INT                                  NULL,
    [Active]       BIT                              NOT NULL  CONSTRAINT [DF_ProductIcon_Active] DEFAULT ((1)),
    [Tier2]        VARCHAR(10)                      NOT NULL  CONSTRAINT [DF_ProductIcon_Tier2] DEFAULT (''),
    CONSTRAINT   [PK_ProductIcon]  
PRIMARY KEY CLUSTERED  
([ClassID] asc, [SegmentID] asc, [GroupID] asc, 
 [Tier1] asc, [LanguageID] asc, [SortOrder] asc, [Tier2] asc))
Run Code Online (Sandbox Code Playgroud)

题:

如果我确切地知道如何使用统计数据,我可能能够决定是否应该保留两者或其中之一。

有什么方法可以让我拥有这个愿景,以便我可以决定我应该保留其中的哪一个?

对于这一点,我们仍在使用 sql 2005。

该表目前没有任何其他索引,但指定以下索引缺失

CREATE NONCLUSTERED INDEX IDX_IconTypeID_Active_INC_1_2_3_4_5_6 
ON [dbo].[ProductIcon] ([IconTypeID], [Active]) 
INCLUDE (ClassID,SegmentID,GroupID,Tier1,Descr,Tier2) 
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 6

他们不是多余的,不。

每个统计对象都包含存储在列出的第一个列中的值的直方图。对于其余列,每个级别仅保留密度信息(无直方图)。

例如,建议的(ClassID、SegmentID、GroupID、Tier1、LanguageID、Active)统计将创建:

  • ClassID 值的直方图
  • 密度数:
    • 类 ID,段 ID
    • ClassID、SegmentID、GroupID
    • ClassID、SegmentID、GroupID、Tier1
    • ClassID、SegmentID、GroupID、Tier1、LanguageID
    • ClassID、SegmentID、GroupID、Tier1、LanguageID、活动

当列之间存在相关性时,这些密度可能很有用,但仅适用于相等谓词(并且在使用“新”基数估计器时,您将需要 SQL Server 2016 才能获得此好处。原始基数估计器默认使用此密度信息)。

您可以使用 来查看直方图和密度信息DBCC SHOW_STATISTICS

请注意列的顺序很重要。此统计信息可以为(ClassID、SegmentID 和 GroupID)而非(ClassID、GroupID)的等式谓词提供平均密度信息。

就存储而言,统计数据相当轻量级,但您需要了解维护它们的潜在成本,尤其是在需要高采样率才能达到可接受的质量的大型表上。

如果 DTA 推荐了一项统计数据,这很好地表明该统计数据对您的工作负载中的一个或多个查询有用。我不记得 DTA 是否报告了有助于推荐的查询,但如果不是,对于上面的示例,您将在列出的所有列上查找具有相等谓词的查询。如果您真的想深入了解细节,请比较使用和不使用新统计数据的计划和基数估计的质量。

缺失的索引会在 (IconTypeID, Active) 上创建一个关联的统计数据,在 IconTypeID 上有一个直方图,以及组合的平均密度信息 (IconTypeID, Active)。

有关更多信息,请参阅以下内容: