有关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
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • sql常见面试题
  • SQL SERVER 2005性能之跟踪
  • SQL编程(一)
  • LINUX上RMAN自动备份脚本
  • sql server面试题
  • 如何将多个SQL查询统计结果一次显示出来
  • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
  • SQL小技巧系列 --- 行转列合并
  • sql server 列转行

数据库技术导航

SqlserverMysqlOracleDB2数据库数据库综合
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1