有关SQL Server分布统计的问题(2)
来源:未知 责任编辑:责任编辑 发表时间:2014-02-18 03:26 点击:次
下面介绍直方图
下面对输出结果进行解释:
RANGE_HI_KEY: 每一个直方图中的键值,以第4行RANGE_HI_KEY为什么111的为例,代表的意思是范围从108(107-第3行)到111.
RANGE_ROWS:大于上一个RANGE_HI_KEY键值(107)并且小于当前RANGE_HI_KEY键值(111)的行数,例如:从108到110之间(不包括111),满足的行数有160行。
EQ_ROWS:等于RANGE_HI_KEY值的行数,如等于111的行有64个。
DISTINCT_RANGE_ROWS: 范围间内非重复行数,例如:从108到110之间,共有3条,即108、109、110。
AVG_RANGE_ROWS: 范围平均行数(RANGE_ROWS/DISTINCT_RANGE_ROWS),例如:第4行为例,其AVG行数为53.33333(160/3)。
要理解直方图的使用,我们通过一个简单的表作为示例,在该示例表上创建一些统计来分析查询优化器是如何使用这些统计的;我们首先创建一个表,接着在该表上创建统计,脚本如下:
1: use tempdb
2: GO
3: IF OBJECT_ID('Itens') IS NOT NULL
4: DROP TABLE Itens
5: GO
6: CREATE TABLE dbo.Itens(Quantidade int NULL)
7: GO
8: CREATE STATISTICS Stats_Quantidade ON Itens(Quantidade)
9: GO
10: UPDATE STATISTICS Itens WITH ROWCOUNT = 50000, PAGECOUNT = 180
11: GO
12: UPDATE STATISTICS Itens Stats_Quantidade WITH STATS_STREAM = 0x01000000010...
由于这里使用了STATS_STREAM来设置统计,可以点击下载脚本来创建。
下面来看下表的直方图:
1: DBCC SHOW_STATISTICS (Itens, Stats_Quantidade) WITH HISTOGRAM
接下来通过一些查询来看下执行计划。
示例一:(EQ_ROWS)
1: SELECT * FROM Itens
2: WHERE Quantidade = 107
3: OPTION (RECOMPILE)
从执行计划可以看出,SQL Server根据WHERE子句的条件值107估计的行数为60,该数值对应直方图中RANGE_HI_KEY为107的EQ_ROWS。
示例二:(RANGE_ROWS+EQ_ROWS)
1: SELECT * FROM Itens
2: WHERE Quantidade <=107
3: OPTION (RECOMPILE)
从执行计划中看出,查询优化器根据直方图中的行数进行条件筛选,对Quantidate<=107的行进行汇总:
说明:总行数=0+56+171+59+88+60=434,此数字与执行计划中“估计行数”一致。
示例三:(AVG_RANGE_ROWS)
假如,我们对条件值进行变化,如下:
1: SELECT * FROM Itens
2: WHERE Quantidade =108
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>