有关SQL Server分布统计的问题(3)
来源:未知 责任编辑:责任编辑 发表时间:2014-02-18 03:26 点击:次
3: OPTION (RECOMPILE)
注意执行计划中红色圈注的部分,由于这次条件筛选的值108不在直方图中,故查询优化器使用AVG_RANGE_ROWS列来估计返回的行数,在本例中,在108到110之间的平均值为53.3333。
示例四:(RANGE_ROWS+EQ_ROWS+AVG_RANGE_ROWS)
1: SELECT * FROM Itens
2: WHERE Quantidade <=112
3: OPTION (RECOMPILE)
本例与上面的示例二类似,不同的是,由于直方图中并不包含112这个值,故SQL Server需要把AVG_RANGE_ROWS(50.66667)添加至总和中,即:
说明:估计的行数=0+56+171+59+88+60+160+64+50.66667=708.667,此值与执行计划中的“估计行数”一致。
示例五:(RANGE_ROWS+EQ_ROWS+SPECIAL_AVG_RANGE_ROWS)
1: SELECT * FROM Itens
2: WHERE Quantidade <=113
3: OPTION (RECOMPILE)
本例的查询与示例四很类似,不同的是,这次过滤的条件值为113,这对查询优化器来说是很容易判断要估计的行数,只再需对50.66667添加两次,原因是112和113都不在直方图中),故得出以下格式:
0+56+171+59+88+60+160+64+50.66667+50.66667=759.33334。
不过,查询优化器估计的值为744.857,那问题是它如何得到此值呢?
答案是:查询优化器汇总了两次43.42857,那查询优化器又是如何得到43.42857?
回答这个问题,查询优化器没有使用AVG_RANGE_ROWS列的值,而使用新的计算公式,即:
special_avg_range_rows = range_rows / ( distinct_range_rows + 1 ),根据直方图中第5行来计算:
304/(6+1) = 43.42857.
由此得出估计的行数公式:
0+56+171+59+88+60+160+64+43.42857+43.42857=744.85714
作者 Yuejun Sun
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>