DBCC SHOW_STATISTICS (Transact-SQL)

DBCC SHOW_STATISTICS 显示表或索引视图的当前查询优化统计信息。查询优化器使用统计信息估计查询结果中的基数或行数,这样,查询优化器可以创建高质量的查询计划。例如,查询优化器可以使用基数估计在查询计划中选择索引查找运算符而不是索引扫描运算符,从而通过避免消耗大量资源的索引扫描来提高查询性能。

查询优化器将表或索引视图的统计信息存储在统计信息对象中。对于表,统计信息对象是根据索引或表列的列表创建的。统计信息对象包含一个带有统计信息的相关元数据的标题、一个带有统计信息对象第一个键列中的值的分布的直方图,以及一个用于度量各列之间的相关性的密度向量。数据库引擎可以使用统计信息对象中的任何数据计算基数估计。

DBCC SHOW_STATISTICS 根据统计信息对象中存储的数据显示标题、直方图和密度向量。使用以下语法,您可以指定表或索引视图以及目标索引名称、统计信息名称或列名。本主题说明如何显示统计信息以及如何理解显示的结果。

有关详细信息,请参阅使用统计信息提高查询性能

主题链接图标Transact-SQL 语法约定

语法

DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target ) 
[ WITH [ NO_INFOMSGS ] < option > [ , n ] ]
< option > :: =
    STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM

参数

  • table_or_indexed_view_name
    要显示其统计信息的表或索引视图的名称。

  • target
    要显示其统计信息的索引、统计信息或列的名称。如果 target 是表或索引视图的现有索引或统计信息的名称,则返回有关此目标的统计信息。如果 target 是现有列的名称,且此列中存在自动创建的统计信息,则返回有关该自动创建的统计信息的信息。如果列目标中不存在自动创建的统计信息,则返回错误消息 2767。

  • NO_INFOMSGS
    取消严重级别从 0 到 10 的所有信息性消息。

  • STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM [ **,**n ]
    如果指定以上一个或多个选项,将根据指定的选项限制该语句返回的结果集。如果没有指定任何选项,则返回所有统计信息。

    STATS_STREAM 为 标识为仅供参考。不提供支持。不保证以后的兼容性。

结果集

下表对指定 STAT_HEADER 时结果集中所返回的列进行了说明。

列名

说明

Name

统计信息对象的名称。

Updated

上一次更新统计信息的日期和时间。STATS_DATE 函数是另一种检索此信息的方法。

Rows

上次更新统计信息时表或索引视图中的总行数。如果筛选统计信息或者统计信息与筛选索引对应,该行数可能小于表中的行数。有关详细信息,请参阅使用统计信息提高查询性能

Rows Sampled

用于统计信息计算的抽样总行数。如果 Rows Sampled < Rows,显示的直方图和密度结果则是根据抽样行估计的。

Steps

直方图中的梯级数。每个梯级都跨越一个列值范围,后跟上限列值。直方图梯级是根据统计信息中的第一个键列定义的。最大梯级数为 200。

Density

计算公式为:1/统计信息对象第一个键列中的所有值(不包括直方图边界值)的非重复值。查询优化器不使用此 Density 值,显示此值的目的是为了与 SQL Server 2008 之前的版本实现向后兼容。

Average Key Length

统计信息对象中所有键列的每个值的平均字节数。

String Index

Yes 指示统计信息对象包含字符串摘要统计信息,以改进对使用 LIKE 运算符的查询谓词的基数估计;例如 WHERE ProductName LIKE '%Bike'。字符串摘要统计信息与直方图分开存储,如果统计信息对象为 char、varchar、nchar、nvarchar、varchar(max)、nvarchar(max)、text 或 ntext. 类型,则基于其第一个键列创建字符串摘要统计信息。

Filter Expression

包含在统计信息对象中的表行子集的谓词。NULL = 未筛选的统计信息。有关筛选的谓词的详细信息,请参阅筛选索引设计准则。有关更筛选的统计信息的详细信息,请参阅使用统计信息提高查询性能

Unfiltered Rows

应用筛选表达式前表中的总行数。如果筛选表达式为 NULL,则 Unfiltered Rows 等于 Rows。

下表对指定 DENSITY_VECTOR 时结果集中所返回的列进行了说明。

列名

说明

All Density

Density 为 1/非重复值。结果显示统计信息对象中各列的每个前缀的密度,每个密度显示一行。非重复值是每个行前缀和列前缀的列值的非重复列表。例如,如果统计信息对象包含键列 (A, B, C),结果将报告以下每个列前缀中非重复值列表的密度:(A)、(A,B) 以及 (A, B, C)。使用前缀 (A, B, C),以下每个列表都是一个非重复值列表:(3, 5, 6)、(4, 4, 6)、(4, 5, 6) 和 (4, 5, 7)。使用前缀 (A, B),相同列值则具有以下非重复值列表:(3, 5)、(4, 4) 和 (4, 5)。

Average Length

存储列前缀的列值列表的平均长度(以字节为单位)。例如,如果列表 (3, 5, 6) 中的每个值都需要 4 个字节,则长度为 12 个字节。

Columns

为其显示 All density 和 Average length 的前缀中的列的名称。

下表对指定 HISTOGRAM 选项时结果集中所返回的列进行了说明。

列名

说明

RANGE_HI_KEY

直方图梯级的上限列值。列值也称为键值。

RANGE_ROWS

其列值位于直方图梯级内(不包括上限)的行的估算数目。

EQ_ROWS

其列值等于直方图梯级的上限的行的估算数目。

DISTINCT_RANGE_ROWS

非重复列值位于直方图梯级内(不包括上限)的行的估算数目。

AVG_RANGE_ROWS

重复列值位于直方图梯级内(不包括上限)的平均行数(如果 DISTINCT_RANGE_ROWS > 0,则为 RANGE_ROWS / DISTINCT_RANGE_ROWS)。

注释

直方图

直方图度量数据集中每个非重复值的出现频率。查询优化器根据统计信息对象第一个键列中的列值来计算直方图,它选择列值的方法是以统计方式对行进行抽样或对表或视图中的所有行执行完全扫描。如果直方图是根据一组抽样行创建的,存储的总行数和非重复值总数则为估计值,且不必为整数。

若要创建直方图,查询优化器将对列值进行排序,计算与每个非重复列值匹配的值数,然后将列值聚合到最多 200 个连续直方图梯级中。每个梯级都包含一个列值范围,后跟上限列值。该范围包括介于两个边界值之间的所有可能列值,但不包括边界值自身。最小排序列值是第一个直方图梯级的上限值。

下面的关系图显示包含六个梯级的直方图。第一个上限值左侧的区域是第一个梯级。

6 个步骤的直方图

对于每个直方图梯级:

  • 粗线表示上限值 (RANGE_HI_KEY) 和上限值的出现次数 (EQ_ROWS)

  • RANGE_HI_KEY 左侧的纯色区域表示列值范围和每个列值的平均出现次数 (AVG_RANGE_ROWS)。第一个直方图梯级的 AVG_RANGE_ROWS 始终是 0。

  • 点线表示用于估计范围中的非重复值总数 (DISTINCT_RANGE_ROWS) 和范围中的总值数 (RANGE_ROWS) 的抽样值。查询优化器使用 RANGE_ROWS 和 DISTINCT_RANGE_ROWS 计算 AVG_RANGE_ROWS,且不存储抽样值。

查询优化器按照直方图梯级的统计重要性来定义直方图梯级。它使用最大差异算法使直方图中的梯级减至最少,并同时最大化边界值之间的差异。最大梯级数为 200。直方图梯级数可以少于非重复值的数目,即使对于边界点少于 200 的列也是如此。例如,具有 100 个非重复值的列所具有的直方图的边界点可以少于 100。

密度向量

查询优化器使用密度提高根据相同表或索引视图返回多个列的查询的基数估计。密度向量针对统计信息对象中的列的每个前缀包含一个密度。例如,如果统计信息对象包含键列 CustomerId、ItemId、Price,则根据以下每个列前缀计算密度。

列前缀

计算密度所基于的对象

(CustomerId)

具有与 CustomerId 匹配的值的行

(CustomerId, ItemId)

具有与 CustomerId 和 ItemId 匹配的值的行

(CustomerId, ItemId, Price)

具有与 CustomerId、ItemId 和 Price 匹配的值的行

限制

DBCC SHOW_STATISTICS 不提供空间索引的统计信息。

权限

若要查看统计信息对象,用户必须是表所有者,或者是 sysadmin 固定服务器角色、db_owner 固定服务器角色或 db_ddladmin 固定数据库角色的成员。

示例

A. 返回所有统计信息

下面的示例显示 Person.Address 表的 AK_Product_Name 索引的所有统计信息。

USE AdventureWorks2008R2;
GO
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid);
GO

B. 指定 HISTOGRAM 选项

下面的示例将为 AK_Product_Name 索引显示的统计信息限制为 HISTOGRAM 数据。

USE AdventureWorks2008R2;
GO
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid) WITH HISTOGRAM;
GO