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

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

 

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

 

create_date datetime    对象的建立日期。函数

modify_date datetime    上次使用 ALTER 语句修改对象的日期。 若是对象为表或视图,则建立或修改表或视图的汇集索引时,modify_date 也会随之更改。测试

 

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

 

 

SELECT * INTO TEST FROM sys.objectsspa

 

 

CREATE INDEX PK_TEST ON TEST(object_id);code

 

clip_image001

 

CREATE INDEX IX_TEST_N1 ON TEST(name);orm

 

 

clip_image002

 

如上所示,STATS_DATE获取索引的统计信息更新时间,彷佛能够做为索引建立的时间。可是我后面就有例子,反证这个是不许确(不靠谱)的。接下来,咱们看看,使用STATS_DATE来获取索引重建的时间。以下所示:server

 

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

相关文章
相关标签/搜索