设为首页 收藏本站
查看: 1053|回复: 0

[经验分享] SQL Server研究之统计信息—发现过期统计信息并处理详解

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-8-8 08:58:03 | 显示全部楼层 |阅读模式
前言:        统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据。
        在创建列的统计信息后,在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值很高的统计信息:









1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

SELECTDISTINCT

        OBJECT_NAME(SI.object_id)AS Table_Name,

        SI.nameAS Statistics_Name,

        STATS_DATE(SI.object_id,SI.index_id)AS Last_Stat_Update_Date,

        SSI.rowmodctrAS RowModCTR,

        SP.rowsAS Total_Rows_In_Table,

        'UPDATE STATISTICS ['+ SCHEMA_NAME(SO.schema_id)+ '].['

        +OBJECT_NAME(SI.object_id)+ ']'+ SPACE(2)+ SI.nameAS Update_Stats_Script

FROM    sys.indexesAS SI(NOLOCK )

        INNERJOIN sys.objectsAS SO(NOLOCK )ON SI.object_id= SO.object_id

        INNERJOIN sys.sysindexesSSI(NOLOCK )ON SI.object_id= SSI.id

                                                    ANDSI.index_id= SSI.indid

        INNERJOIN sys.partitionsAS SPON SI.object_id= SP.object_id

WHERE  SSI.rowmodctr> 0

        ANDSTATS_DATE(SI.object_id,SI.index_id)IS NOTNULL

        ANDSO.type= 'U'

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-23403-1-1.html 上篇帖子: 使用默认system_health分析死锁(Deadlock) 下篇帖子: SQLServer如何处理数据集的维度变化 统计 信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表