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

栏目: 数据库 · SQL Server · 发布时间: 5年前

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

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

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

create_datedatetime     对象的创建日期。

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

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

SELECT * INTO TEST FROM sys . objects

CREATE INDEX PK_TEST ON TEST ( object_id );

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

CREATE INDEX IX_TEST_N1 ON TEST ( name );

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

如上所示,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

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

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

UPDATE STATISTICS TEST   PK_TEST   WITH FULLSCAN ;

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

另外,索引重组(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);

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

参考资料:

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

R Cookbook

R Cookbook

Paul Teetor / O'Reilly Media / 2011-3-22 / USD 39.99

With more than 200 practical recipes, this book helps you perform data analysis with R quickly and efficiently. The R language provides everything you need to do statistical work, but its structure ca......一起来看看 《R Cookbook》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具