您好,欢迎访问一九零五行业门户网

第十二章SQLServer统计信息(3)发现过期统计信息并处理

前言: 统计 信息 是关于谓词中的数据分布的主要 信息 源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能 统计 需要返回的数据。 在创建列的 统计 信息 后,在 dml 操作如 insert 、 update 、 delete 后, 统计 信息 就会过时。因为这些
前言:        统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据。
        在创建列的统计信息后,在dml操作如insert、update、delete后,统计信息就会过时。因为这些操作更改了数据,影响了数据分布。此时需要更新统计信息。
        在高活动的表中,统计信息可能几个小时就会过时。对于静态表,可能几个星期才会过时。这要视乎表上dml的操作。
        从2000开始,sqlserver对增删改操作会增加在表sysindexes中的rowmodctr(row modification counter)值,当统计信息更新后,该值会重置会0,并重新累加。所以查看这个表的这个值就可以知道统计信息是否过时。
        在2000之后,sqlserver改变了这种跟踪方式,把更改存放到对应的数据行上。这个值是未公开的colmodctr。
        但是sys.sysindexes到2012依旧可用,还是可以用这个表的数值来确定是否过期。
准备工作:本文将用到下面的系统视图和兼容性视图:
1、  sys.sysindexes:兼容性视图,提供rowmodctr列值,是本文的核心。
2、  sys.indexes:使用表id来获得统计信息名。
3、  sys.objects:获取架构名。
步骤:显示rowmodctr值很高的统计信息:
select distinct object_name(si.object_id) as table_name , si.name as statistics_name , stats_date(si.object_id, si.index_id) as last_stat_update_date , ssi.rowmodctr as rowmodctr , sp.rows as total_rows_in_table , 'update statistics [' + schema_name(so.schema_id) + '].[' + object_name(si.object_id) + ']' + space(2) + si.name as update_stats_scriptfrom sys.indexes as si( nolock ) inner join sys.objects as so( nolock ) on si.object_id = so.object_id inner join sys.sysindexes ssi( nolock ) on si.object_id = ssi.id and si.index_id = ssi.indid inner join sys.partitions as sp on si.object_id = sp.object_idwhere ssi.rowmodctr > 0 and stats_date(si.object_id, si.index_id) is not null and so.type = 'u'order by rowmodctr desc
分析:需要了解一些事情:
1、  从你上次更新统计信息是何时的事情?
2、  在更新统计信息之后有多少事务发生在表上?
3、  哪些t-sql需要用于更新统计信息。
4、  更新统计信息是否可行?这个是对比rowmodctr列和total_rows_in_table列。
当在数据库开启了auto_update_statistics之后,还有数据的话,那就有必要更新统计信息。下面有一些规则:
1、  表大小从0增长。
2、  当表的数据小于等于500时没有问题,并且colmodctr从超过500行之后开始增长。
3、  当表的行数超过500行时,在统计信息对象的引导列的colmodctr值超过500+20%的行数时,就需要更新。
例子:有一个100万行的表,优化器会在插入200500行新数据后认为统计信息过时。但是这并不是绝对化的。
扩充知识:没有直接的方式访问colmodctr的值,因为它只是用于优化引起,并且对用户透明,但是可以使用dac(专用管理员连接)来访问sys.sysrscols.rcmodified系统。但是仅在2008r2及以后版本才可用。
其它类似信息

推荐信息