以下的文章主要向大家讲述的是SQL Server索引直方图(The Statistics Histogram),在直方图中,其至多可存储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信息片段。

    Listing34.2DBCCSHOW_STATISTICSOutputforthetitleidindIndexonthesalesTableinthebigpubs2000Database StatisticsforINDEX'titleidind'. UpdatedRowsRowsSampledStepsDensityAveragekeylength Aug21200111:18PM1687251687252001.8955356E-326.405577 (1row(s)affected) AlldensityAverageLengthColumns 1.8621974E-36.0title_id 5.997505E-610.0title_id,stor_id 5.9268041E-626.405577title_id,stor_id,ord_num (3row(s)affected) RANGE_HI_KEYRANGE_ROWSEQ_ROWSDISTINCT_RANGE_ROWSAVG_RANGE_ROWS BI01940.0314.000.0 BI2184613.0343.02306.5 BI2574270.0277.01270.0 BI3224618.0286.02309.0 BI3976311.0293.01311.0 BI6450673.0300.02336.5 BI9506947.0292.03315.66666 BU1111296.0299.01296.0 BU7832349.0334.01349.0 CH02491011.0311.03337.0 CH0639984.0307.03328.0 ... TC42030.0321.000.0 TC77770.0297.000.0 (200row(s)affected)

从这个例子你可以看出,每个范围内有更多的值(RANG_ROWS),并且每个step中包含了更多的重复值(EQ_ROWS)。另外,直方图中的所有200行都被使用了,表中的168,725行记录分布在这些200行中。所有的168,725行都被用来生成统计信息(Rows Sampled)。

只有当一个常量表达式与索引列进行比较时,并且常量表达式的值在查询编译时是已知时,SARG的计算才能使用直方图的step值。直方图中的step可以为SARG使用的的例子包括:

    Wherecol_a=getddate() Wherecust_id=12345 Wheremonthly_sales<10000/12 Wherel_namelike"Smith"+"%"

有些常量表达式的直到查询运行时才能计算出来。这些查询参数中包含了局部变量或者子查询:

    Whereprice=@avg_price Wheretotal_sales>(selectsum(qty)fromsales) Wheretitles.pub_id=publishers_id

对于这些类型的表达式,你需要其他方法来估计匹配的行数。另外,因为直方图steps只记录了索引中第一列的值,当需要评估组合索引的多列的SARG匹配的行数时,SQL Server必须使用不同方法来决定,例如下面:

    Select*fromsales Wheretitle_id='BI3976' Andstor_id='p648'

当直方图没有被使用或者不能使用时,SQL Server使用索引密度值来估计匹配的行数,以上的相关内容就是对SQL Server索引直方图(The Statistics Histogram)的介绍,望你能有所收获。

【编辑推荐】

    创建SQL Server数据库更是实在SQL Server创建表所要用到的代码SQL Server创建约束的代码运用实现SQL Server创建事务要用到的代码优化SQL Server数据库的经验大盘点