在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);

CREATE INDEX IX_TEST_N1 ON TEST(name);

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

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

UPDATE STATISTICS TEST  PK_TEST  WITH FULLSCAN ;

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

 

参考资料:

 

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

SQL Server中是否可以准确获取最后一次索引重建的时间?的更多相关文章

  1. SQL Server中如何识别、查找未使用的索引(unused indexes)

    在SQL Server中,索引是优化SQL性能的一大法宝.但是由于各种原因,索引会被当做"银弹"滥用,一方面有些开发人员(甚至是部分数据库管理员)有一些陋习,不管三七二十一,总是根 ...

  2. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  3. 理解SQL Server中索引的概念

    T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他   简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能 ...

  4. T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索 ...

  5. 理解SQL Server中索引的概念,原理

    转自:http://www.cnblogs.com/CareySon/archive/2011/12/22/2297568.html 简介 在SQL Server中,索引是一种增强式的存在,这意味着, ...

  6. T-SQL查询进阶--理解SQL Server中索引的概念,原理

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,sql server仍然可以实现应有的功能,但索引可以在大多数情况下提升查询性能,在OLAP(On line Trans ...

  7. 理解SQL Server中索引的概念,原理以及其他(转载)

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索 ...

  8. 在SQL SERVER中获取表中的第二条数据

    在SQL SERVER中获取表中的第二条数据, 思路:先根据时间逆排序取出前2条数据作为一个临时表,再按顺时排序在临时表中取出第一条数据 sql语句如下: select top 1 * from(se ...

  9. (4.17)sql server中的uuid获取与使用

    sql server中的uuid  建表: 1.自增长 studentno int primary key identity(1,1)——bigint也是可以的 2.创建uuidcustomerid  ...

随机推荐

  1. 转)ZooKeeper的实现分析

    最近在大量看关于Zookeeper的博客,发现一篇讲解ZK实现很详细的博客,特此转载一下: 原博客地址: http://my.oschina.net/zhengyang841117/blog/1866 ...

  2. shell 中的for、while循环及if语句

    shell与其他语言一样也支持for.while循环 for循环的一般格式如下: #!/bin/sh for 变量 in 列表 do command command command ......... ...

  3. jmeter 监听器聚合报告说明:

    Label:表示定义HTTP请求名称 Samples:表示这次测试中一共发出了多少个请求. Average:平均响应时长---默认情况下是单个Request的平均响应时长,当使用了Transactio ...

  4. 用python对比两张图片的不同

    from PIL import Image from PIL import ImageChops def compare_images(path_one, path_two, diff_save_lo ...

  5. TestNG深入理解

    以下内容引自: http://blog.csdn.net/wanglha/article/details/42004695 TestNG深入理解 转载 2014年12月18日 13:56:11 参考文 ...

  6. PLINQ的 ForAll 对比集合的ForEach

    在 PLINQ 中,还可以使用 foreach 执行查询以及循环访问结果. 但是,foreach 本身不会并行运行,因此,它要求将所有并行任务的输出合并回该循环正在上面运行的线程中. 在 PLINQ ...

  7. dirlock.go

    // +build !windows package dirlock import (     "fmt"     "os"     "syscall ...

  8. Nordic nRF51/nRF52开发流程说明

    Nordic nRF51系列包括nRF51822/nRF51422/nRF51802等芯片,nRF52系列包括nRF52832/nRF52840/nRF52810等芯片,硬件工程师可以按照如下流程去评 ...

  9. BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德

    BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们 ...

  10. 阿里巴巴Java开发程序猿年薪40W是什么水平?

    对于年薪40万的程序员,不只是技术过硬,还有一个原因是他们所在的公司福利高,或者会直接持股.在BAT中就是一个很好的案例,例如阿里巴巴P7,P8级别的员工不仅是年薪30到80万不等,还有更多股票持有. ...