• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
fly_zj
博客园    首页    新随笔    联系   管理    订阅  订阅

在sqlserver中,优化器如何利用统计信息来估算返回的行数(二)

如果在TSQL中使用临时变量,优化器又是如何来评估行数的?

dbcc FreeProcCache
declare @dt datetime='2006-04-26 11:44:30.217'
select * from dbo.DatabaseLog 
where PostTime=@dt
OPTION
(
    QUERYTRACEON 3604,
    QUERYTRACEON 9292,
    QUERYTRACEON 9204
)

使用 dbcc FreeProcCache是为了让优化器每次执行时都重新生成执行计划,同样也会使用到postTime上的统计信息

image

而该TSQL执行时预估的行数为:

image

这个行数是怎么计算出来的呢?

image

 

这个时候预估的行数就不是使用直方图里数据,而是使用密度*行数得到的

密度=1/select (distinct column) from tabname

而该列PostTime 的密度为 0.003174603*389=1.234920,即为预估的行数。

在TSQL中,只要是where语句中的字段或者是 on 中的字段,上面自动或手动新建的统计信息都会被使用到,

即使是唯一索引,根据元信息就可以判断只返回一条,优化器也会加载唯一索引上的统计信息,来

生成相应的执行计划。大家可以使用 option() 选项可以查明。

 

总结:在使用临时变量时,优化器是根据密度*行数来推断出平均的返回行数,据此生成执行计划!

posted @ 2013-04-21 21:20  fly_zj  阅读(389)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3