• SQL Server中是否可以准确获取最后一次索引重建的时间?


    在SQL Server中,我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢?  答案是我们无法准确的找到索引的创建时间、最后一次索引重组时间,最后一次索引重建的时间。 其实就目前SQL Server的各个版本而言,还没有一个系统表或DMV视图有保存索引创建的时间,索引重建的时间、索引重组的时间。但是有些方法可以间接得到最后一次索引重建的时间,但是这个值有时候往往不是准确的(有时候是准确的,有时候是不准确的)。

     

    在sys.sysindexes 中没有记录索引的创建、修改时间。而在sys.objects中,有create_date和modify_date两个字段,但是sys.objects不会记录所有索引的相关信息。所以modify_date的值不能作为用来判断索引重建、索引重组的时间。这两个字段的具体意义如下:

     

    create_date datetime    对象的创建日期。

    modify_date datetime    上次使用 ALTER 语句修改对象的日期。 如果对象为表或视图,则创建或修改表或视图的聚集索引时,modify_date 也会随之更改。

     

    其实,我们往往可以根据STATS_DATE函数来获取索引的最后一次重建时间(不准确),STATS_DATE:返回表或索引视图上统计信息的最新更新的日期。如下测试所示:

     

     

    SELECT * INTO TEST FROM sys.objects

     

     

    CREATE INDEX PK_TEST ON TEST(object_id);

     

    clip_image001

     

    CREATE INDEX IX_TEST_N1 ON TEST(name);

     

     

    clip_image002

     

    如上所示,STATS_DATE获取索引的统计信息更新时间,似乎可以作为索引创建的时间。但是我后面就有例子,反证这个是不准确(不靠谱)的。接下来,我们看看,使用STATS_DATE来获取索引重建的时间。如下所示:

     

    ALTER INDEX IX_TEST_N1 ON TEST REBUILD;
     
     
     
    SELECT  name AS Stats ,
            STATS_DATE(object_id, stats_id) AS LastStatsUpdate
    FROM    sys.stats
    WHERE   object_id = OBJECT_ID('dbo.TEST')
            AND LEFT(name, 4) != '_WA_';
      
    GO

     

     

     

    clip_image003

     

    但是更新索引的统计信息也会引起对应的STATS_DATE的时间变化,此时这个时间就不是索引的最后一次重建时间(Index Rebuild)了。所以使用索引对应统计信息的最后一次更新时间作为最后一次索引重建的时间,有时候往往不准确。这个只能作为参考,而不能作为依据。

     

     

     

    UPDATE STATISTICS TEST  PK_TEST  WITH FULLSCAN ;

     

    clip_image004

     

     

     

    另外,索引重组(INDEX REORGANIZE)不会引起索引对应统计信息的更新,所以这个STATS_DATE系统函数不能作为索引重组的时间依据。

     

     

    ALTER INDEX IX_TEST_N1 ON TEST REORGANIZE;

     

     

    最后,我们来看一个例子。如下所示,创建一个空表,我们可以看到,没有生成相关索引的统计信息。这种场景下,STATS_DATE函数返回的值为NULL,此时可以看到STATS_DATE 并不能作为索引创建的时间。或者换个说法,这个案例就是一个活生生的反例。

     

    DROP TABLE TEST;
     
     
    CREATE TABLE TEST
        (
          ID INT ,
          NAME VARCHAR(12) ,
          SEX BIT DEFAULT 0 ,
          CONSTRAINT  PK_TEST  PRIMARY KEY(ID)
        );
     
    SELECT GETDATE();
     
     
     
    CREATE INDEX IX_TEST_N1 ON TEST(NAME, SEX);

     

     

     

     

    clip_image005

     

     

     

    参考资料:

     

     

    https://dba.stackexchange.com/questions/82943/find-out-when-your-index-was-last-rebuilt-reorganized

    https://social.technet.microsoft.com/wiki/contents/articles/18767.sql-server-how-to-check-when-index-was-last-rebuilt.aspx

     

  • 相关阅读:
    一些信息熵的含义
    scikit-learn包的学习资料
    DB Scan算法的分析与实现
    ps教程连接
    用PS如何把图片调出时尚杂志色
    Linux FIFO读写时堵塞与非堵塞的效果
    yuyv转yuv420p代码及验证代码
    YUV格式介绍
    too many include files depth = 1024错误原因
    开发用小工具
  • 原文地址:https://www.cnblogs.com/kerrycode/p/10394427.html
Copyright © 2020-2023  润新知