日期:2014-05-17  浏览次数:20569 次

SQL Server的统计信息
我知道统计信息是为查询引擎做查询计划用的,现在有以下请教大家,谢谢!

1.统计信息是什么时候会自动建立与更新,Insert、update、delete时候会自动更新统计信息吗?

2.当我把数据库设置中的"自动创建统计信息"与"自动更新统计信息"设置为True,我还需要建立维护计划中建立计划维护统计信息吗?此处的自动建立与更新在什么时候会自动更新?

3.当我修改表结构与dbcc dbreindex时都会自动更新表或view的统计信息吗?

4.统计信息更新与建立时是生成一些什么信息?

------解决方案--------------------
1.统计信息是什么时候会自动建立与更新,Insert、update、delete时候会自动更新统计信息吗?
1、开启了自动创建和更新的话(AUTO_CREATE_STATISTICS/AUTO_UPDATE_STATISTICS/AUTO_UPDATE_STATISTICS_ASYNC),sqlserver会维护,否则,需要手动创建,Insert、update、delete需要到达一定数量级才会触发自动更新,比如:
1、如果统计信息定义在实体表,且表格从没有数据变成大于等于1条数据,或者对于小于500行的表,当统计信息第一个列的累计变化大于500以后,或者对于大于500行的表,统计信息第一列累计变化量大于500+(20%*表中总数)以后。即对于大表,只有1/5的数据发生变化时,sqlserver才会更新统计信息。
2、如果是临时表,维护策略和实体表几乎一样,但是表变量不维护统计信息。

2.当我把数据库设置中的"自动创建统计信息"与"自动更新统计信息"设置为True,我还需要建立维护计划中建立计划维护统计信息吗?此处的自动建立与更新在什么时候会自动更新?
由于无法保证sqlserver永远都更新及时,所以可以在系统闲时进行手动更新,比如用维护计划。但是注意不要每次都用fullscan,开销很大。自动更新在你第一个问题中已经回答了。
3.当我修改表结构与dbcc dbreindex时都会自动更新表或view的统计信息吗?
4.统计信息更新与建立时是生成一些什么信息?
其实你的问题还是在什么情况下sqlserver会自动维护统计信息,可以参考我的文章:
http://blog.csdn.net/dba_huangzj/article/details/8702293
http://blog.csdn.net/dba_huangzj/article/details/8702320
http://blog.csdn.net/dba_huangzj/article/details/8702351
http://blog.csdn.net/dba_huangzj/article/details/8702359

另外你的问题绝大部分书上都有,联机丛书也有
------解决方案--------------------


1、只要你在数据库设置中的"自动创建统计信息"与"自动更新统计信息"设置为True,那么在语句执行时,不管是update、delete、还是select语句,就会根据where条件中的字段,自动设置统计信息。

但insert 语句运行时,应该不会建立统计信息。

2、虽然设置了自动更新或创建统计信息的设置为true,但是所谓自动更新统计信息,是按照你对数据修改的数量来决定的,sql server有一些内部的判断条件,比如修改的数据占到整个表的百分之多少后,才会更新统计信息,这个不是很准确的。
所以还是需要你通过,update statistics 表 来更新统计信息。

3、如果你没有删除那个统计信息涉及到的列,应该不会重新生成。

4、通过:

dbcc show_statistics('表',统计名称)
------解决方案--------------------
重建索引虽然会重建统计信息,但是日志会过度膨胀,定期的执行优化,可以避免这些问题。
------解决方案--------------------
引用:
版主,2008中哪怎样重建索引呢?tKs!


-- 方法1
alter index [索引名] on [表名] rebuild

-- 方法2
dbcc dbreindex('[表名]','[索引名]',90)