SQL Server索引直方图的内容描述 |
本文标签:SQL Server索引直方图 此文章主要讲述的是SQL Server索引直方图,SQL Server索引直方图中最大程度可以存储200个样本值 。每个样本值称之为一个step 。保存在每个step中样本值是值的范围的端点 。每个step保存了3个值,分别描述为: EQ_ROWS——与样本值相同的行数 。换句话就是该step中重复值的个数 。 RANG_ROWS——表示除了当前值外,介于当前step和前一个step之间其他值的行数 。 Rang Density——表示在该范围内有多少个不同的值 。范围密度信息实际上有两个单独的列组成,分别为:DISTINCT_RANGE_ROWS 和AVG_RANG_ROWS 。 DISTINCT_RANGE_ROWS表示除了当前值外,当前step与前一个step之间具有多少个不同值的个数 。 AVG_RANGE_ROWS在该step范围内,每个不同值的平均行数 。 在listing34.1的输出中,索引中第一列的所有不同键值的值作为样本值存储在直方图中,所以,SQL Server索引直方图中的样本值之间没有值(RANG_ROWS),其后所有的范围值为0 。你可能注意到在last name 为Ringer的索引键值上有一个重复值(EQ_ROWS = 2) 。为了更好比较,Listing34.2显示了bigpubs2000数据库中的sales表的DBCC SHOW_STATISTICS信息片段 。
从这个例子你可以看出,每个范围内有更多的值(RANG_ROWS),并且每个step中包含了更多的重复值(EQ_ROWS) 。另外,SQL Server索引直方图中的所有200行都被使用了,表中的168,725行记录分布在这些200行中 。所有的168,725行都被用来生成统计信息(Rows Sampled) 。 只有当一个常量表达式与索引列进行比较时,并且常量表达式的值在查询编译时是已知时,SARG的计算才能使用直方图的step值 。直方图中的step可以为SARG使用的的例子包括:
有些常量表达式的直到查询运行时才能计算出来 。这些查询参数中包含了局部变量或者子查询:
对于这些类型的表达式,你需要其他方法来估计匹配的行数 。另外,因为直方图steps只记录了索引中第一列的值,当需要评估组合索引的多列的SARG匹配的行数时,SQL Server必须使用不同方法来决定,例如下面:
当SQL Server索引直方图没有被使用或者不能使用时,SQL Server使用索引密度值来估计匹配的行数 。 |