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

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

前言:

        统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据。

        在创建列的统计信息后,在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_Script

FROM    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_id

WHERE   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及以后版本才可用。

时间: 2024-07-28 15:48:20

第十二章——SQLServer统计信息(3)——发现过期统计信息并处理的相关文章

第十二章——SQLServer统计信息(2)——非索引键上统计信息的影响

原文:第十二章--SQLServer统计信息(2)--非索引键上统计信息的影响 前言:         索引对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的统计信息,然后才决定用什么索引.一般情况下,默认会在创建索引时,索引列上均创建统计信息.但是不代表在非索引键上的统计信息对性能没有用.         如果表上的所有列都有索引,那么将会是数据库负担不起,同时也不是一个好想法,包括谓词中用到的所有列加索引同样也不是好方法.因为索引会带来负载.因为需要空间存放索引,且每个D

第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息

原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言:         从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条件的语句来创建非聚集索引,过滤掉不需要的数据,降低索引的维护开销和存储空间,提高查询性能.   准备工作: 在AdventureWorks2012上,有一个Production.WorkOrder表,将使用这个表来做演示.   步骤: 1.  创建一个非聚集索引在Production

第十二章——SQLServer统计信息(1)——创建和更新统计信息

原文:第十二章--SQLServer统计信息(1)--创建和更新统计信息 简介: 查询的统计信息: 目前为止,已经介绍了选择索引.维护索引.如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索引供查询之用,因为SQLServer优化器是基于开销的优化.当在where和on上的列上的数据需要显示在结果集的时候,如果有实时的统计信息,优化器会选择最好的执行方式,因为优化器会从统计信息中获得这些数据的明细情况. 在创建索引的时候,SQLServer就会在索引列上创建统计信息.简单来说,统计信息

【PMP】Head First PMP 学习笔记 第十二章 采购管理

第十二章 采购管理 某些工作就是太大,以至于你的公司无法自行完成. 找到合适的卖方,选择正确类型的关系并确保合同的目标被打成. 有时候,你需要雇用外部公司做一部分的项目工作.这叫做采购(procurement),该外部公司被称为卖方. 项目采购管理包括合同管理和变更控制过程 规划采购管理 实施采购 控制采购 结束采购 项目采购管理围绕包括合同在内的协议来进行.协议是买卖双方之间的法律文件. 合同也可称作协议.谅解.分包合同或订购单. 在合同生命周期中,卖方首先是投标人.然后是中标人,之后是签约供

第十二章 委托[《.net框架程序设计》读书笔记]

.net框架|笔记|程序|设计 第十二章 委托 一. 委托的使用 静态委托和实例委托,使用方法类似,这里给出一个使用可变参数委托的例子: using System; public class DelCls { public delegate void DelDef(params string[] strParams); public static void CallDel(DelDef dd) { if(dd != null) //请务必在此处进行判断,这是个好习惯 { dd("Hello&qu

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

python 教程 第二十二章、 其它应用

第二十二章. 其它应用 1)    Web服务 ##代码 s 000063.SZ ##开盘 o 26.60 ##最高 h 27.05 ##最低 g 26.52 ##最新 l1 26.66 ##涨跌 c1 -0.04 ##涨幅 p2 -0.15% ##总手 v 9190865 ##日期 d1 6/15/2011 ##时间 t1 3:00am #!/usr/bin/env python from time import ctime from urllib import urlopen import

python 教程 第十二章、 标准库

第十二章. 标准库 See Python Manuals ? The Python Standard Library ? 1)    sys模块 import sys if len(sys.argv) < 2: print 'No action specified.' sys.exit() if sys.argv[1].startswith('--'): option = sys.argv[1][2:] if option == 'version': print 'Version 1.2' el

DNF第十二章正式上线女枪四大转职一并放出

(综合/小鸢)2月22日,<地下城与勇士>(简称:DNF)第十二章"划破夜空的子弹"正式上线,同时,人气天王天界玫瑰--女神枪手四大转职也一并放出. 自天界玫瑰华丽上线以来,女神枪手一直备受广大玩家的追捧和关注.今日,随着第十二章上线,女神枪手强势觉醒. 女神枪手分四个职业,分别是女漫游枪手.女枪炮师.女机械师和女弹药师,每个职业都将分别觉醒. 女漫游枪手觉醒为沾血蔷薇,主动觉醒技双枪极舞刃: 女枪炮师觉醒为重炮掌控者,主动觉醒技EMP磁暴: 女机械师觉醒为机械之心,主动觉