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

推荐热点

  • sql常见面试题
  • SQL SERVER 2005性能之跟踪
  • SQL编程(一)
  • LINUX上RMAN自动备份脚本
  • sql server面试题
  • 如何将多个SQL查询统计结果一次显示出来
  • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
  • SQL小技巧系列 --- 行转列合并
  • sql server 列转行
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1