zoukankan      html  css  js  c++  java
  • 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

    /*前言:
            统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据。
            在创建列的统计信息后,在DML操作如insert、update、delete后,统计信息就会过时。因为这些操作更改了数据,影响了数据分布。此时需要更新统计信息。
            在高活动的表中,统计信息可能几个小时就会过时。对于静态表,可能几个星期才会过时。这要视乎表上DML的操作。
            从开始,SQLServer对增删改操作会增加在表sysindexes中的RowModCtr(Row Modification Counter)值,当统计信息更新后,该值会重置会0,并重新累加。所以查看这个表的这个值就可以知道统计信息是否过时。
            在之后,SQLServer改变了这种跟踪方式,把更改存放到对应的数据行上。这个值是未公开的ColModCtr。
            但是sys.sysindexes到依旧可用,还是可以用这个表的数值来确定是否过期。
     
    准备工作:
    本文将用到下面的系统视图和兼容性视图:
    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、 表大小从增长。
    2、 当表的数据小于等于时没有问题,并且ColModCtr从超过行之后开始增长。
    3、 当表的行数超过行时,在统计信息对象的引导列的ColModCtr值超过+20%的行数时,就需要更新。
    例子:有一个万行的表,优化器会在插入行新数据后认为统计信息过时。但是这并不是绝对化的。
     
    扩充知识:
    没有直接的方式访问ColModCtr的值,因为它只是用于优化引起,并且对用户透明,但是可以使用DAC(专用管理员连接)来访问sys.sysrscols.rcmodified系统。但是仅在R2及以后版本才可用。*/
  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/binghou/p/9109677.html
Copyright © 2011-2022 走看看