您的位置:首页 > 其它

统计信息对执行计划的影响

2011-10-27 14:13 405 查看
最近遇到一个问题,示例表结构如下:

setstatisticsioon

[code]usetempdb
go

--droptableTB

createtableTB(idintidentityprimarykey,parentIdint,namevarchar(50))

go

insertintoTB(parentId,name)select0,CAST(NEWID()asvarchar(50))

go499990


insertintoTB(parentId,name)select499990,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499991,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499992,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499993,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499994,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499995,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499996,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499997,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499998,CAST(NEWID()asvarchar(50))

insertintoTB(parentId,name)select499999,CAST(NEWID()asvarchar(50))

go

[/code]
有一个如下的SQL查询:


select*fromTB

[code]whereparentIdin(selectidfromTBwhereparentId=499997)
[/code]
速度非常的慢,明显是因为parentId字段无索引,然后,为其添加了索引:


createindexix_parentIdonTB(parentId)


这时,清下执行计划缓存,再次执行该SQL查询,执行计划如下:


DBCCFREEPROCCACHE






看到有一个ClusteredIndexScan,这个是非常耗io的,而实事上parentId=499997的ID值只有一个,为499998,而parentId=499998的行也只有一条。
IO扫描为:

Table'TB'.Scancount10,logicalreads3882,physicalreads0,read-aheadreads0,loblogicalreads0,lobphysicalreads0,lobread-aheadreads0.
Table'Worktable'.Scancount0,logicalreads0,physicalreads0,read-aheadreads0,loblogicalreads0,lobphysicalreads0,lobread-aheadreads0.

这样看来,这个indexscan非常的不合理。此时,我们看一下索引ix_parentid上的统计信息:




可以看到一共有500000行,采样为500000行,说明在建索引ix_parentid时,应该采用的是全扫描。

接下来,单独执行了一次统计信息更新:


UPDATESTATISTICSTBix_parentId


然后,再次查看统计信息:




此时,统计信息与之前不同,已不是全扫描,而是只采集了163584行,而且并未采集到parentid<>0的数据,再次清空执行计划缓存


DBCCFREEPROCCACHE


然后执行本例的SQL查询,结果如下:





IO扫描为:
Table'TB'.Scancount2,logicalreads9,physicalreads0,read-aheadreads0,loblogicalreads0,lobphysicalreads0,lobread-aheadreads0.

这样来看,执行计划已正常。

在此案例中,由于parentid绝大多数值为0,只有极少数不为0,道理上来讲,并不应该创建索引,但实际业务中,也可能出现此类请求,何去何从?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐