之前写过一篇博客“SQL Server中是否可以准确获取最后一次索引重建的时间?“,里面主要讲述了三个问题:我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢?,当时得出的结论,答案是我们无法准确的找到索引的创建时间、最后一次索引重组时间,最后一次索引重建的时间。但是最近看到一篇博客“SQL Server – Get Index Creation Date”,然后研究了一下,即使SQL Server暂时没有一个系统表或DMV视图有保存索引创建的时间,索引重建的时间、索引重组的时间。但是我们可以通过系统跟踪文件获取它们的值,当然也有限制条件并不是所有的索引都能找到这些值。请见下面详细解说:

索引的创建时间

索引的创建时间,可以用下面SQL获取,但是我们知道跟踪有可能停止或禁用;跟踪文件也可能被覆盖。所以这种方法只能查询最近一段时间的。它有很强的时效性。所以这种方法不能通用。注定其只能作为一种方法参考,而不能通用。

DECLARE @filename VARCHAR(500) 

SELECT @filename = CAST(value AS VARCHAR(500)) 

FROM fn_trace_getinfo(DEFAULT) 

WHERE property = 2 

  AND value IS NOT NULL 

 

-- Go back 4 files since default trace only keeps the last 5 and start from there.

SELECT @filename = substring(@filename, 0, charindex('_', @filename)+1) + convert(varchar, (convert(int, substring(left(@filename, len(@filename)-4), charindex('_', @filename)+1, len(@filename)))-4)) + '.trc'

 

SELECT 

       gt.EventClass, 

       gt.EventSubClass,

       te.Name AS EventName,

       gt.HostName, 

       gt.StartTime, 

       gt.DatabaseName,

       gt.ObjectName,

       gt.IndexID

FROM fn_trace_gettable(@fileName, DEFAULT) gt 

JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id 

WHERE EventClass = 46

  and ObjectType = 22601

  and gt.DatabaseName <> 'tempdb'

ORDER BY StartTime desc; 

索引的重建时间 &索引的重组时间

如下所示,Object:Altered的trace_event_id为164,这里我们无法区分ALTER INDEX ... REBUILD 和  ALETER INDEX ...REORGANIZE. 对于索引重建、索引重组,fn_trace_gettable返回的TextData为Null值,也无从判断。所以这里能记录准确的时间,但是无法区分索引重建与索引重组。

DECLARE @filename VARCHAR(500) 

SELECT @filename = CAST(value AS VARCHAR(500)) 

FROM fn_trace_getinfo(DEFAULT) 

WHERE property = 2 

  AND value IS NOT NULL 

 

-- Go back 4 files since default trace only keeps the last 5 and start from there.

SELECT @filename = substring(@filename, 0, charindex('_', @filename)+1) + convert(varchar, (convert(int, substring(left(@filename, len(@filename)-4), charindex('_', @filename)+1, len(@filename)))-4)) + '.trc'

 

SELECT 

       gt.EventClass, 

       gt.EventSubClass,

       te.Name AS EventName,

       gt.HostName, 

       gt.StartTime, 

       gt.DatabaseName,

       gt.ObjectName,

       gt.IndexID

FROM fn_trace_gettable(@fileName, DEFAULT) gt 

JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id 

WHERE EventClass = 164

  and ObjectType = 22601

  and gt.DatabaseName <> 'tempdb'

ORDER BY StartTime desc; 

 

测试验证如下所示:

USE YourSQLDba;

GO

ALTER INDEX Pk_HistMaintTrav ON [Maint].[JobHistory] REBUILD;

 

ALTER INDEX PK_DataBaseSizeDtl_Day ON [Maint].[DataBaseSizeDtl_Day] REORGANIZE;

 

CREATE INDEX IX_DataBaseSizeDtl_Day_N1 ON [Maint].[DataBaseSizeDtl_Day](DataBaseName);

注意:上面脚本在有些环境可能会出错,主要是因为trac文件的路径,例如C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\log_603.trc 就会遇到下面错误,需要根据实际情况修改脚本。

Msg 245, Level 16, State 1, Line 8

Conversion failed when converting the varchar value '50.MSSQLSERVER\MSSQL\Log\log_603' to data type int.

参考资料

https://sqlconjuror.com/sql-server-get-index-creation-date/

SQL Server获取索引创建时间&重建时间&重组时间的更多相关文章

  1. 【转】SQL SERVER获取索引脚本

    关于如何获取索引脚本的语句很多,上次在项目中需要去查询并获取索引脚本,所以写了一个简单的查询语句来进行获取. WITH    idxcol          AS ( SELECT           ...

  2. Sql Server聚集索引创建

    create CLUSTERED index IX_ZhuiZIDList_ZID on ZhuiZIDList (ZID)

  3. 公司内部培训SQL Server传统索引结构PPT分享

    公司内部培训SQL Server传统索引结构PPT分享 下载地址 http://files.cnblogs.com/files/lyhabc/SQLServer%E4%BC%A0%E7%BB%9F%E ...

  4. SQL Server 数据库索引

    原文:SQL Server 数据库索引 一.什么是索引 减少磁盘I/O和逻辑读次数的最佳方法之一就是使用[索引] 索引允许SQL Server在表中查找数据而不需要扫描整个表. 1.1.索引的好处: ...

  5. SQL Server 查询优化 索引的结构与分类

    一.索引的结构 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有数据页在磁盘上是如何组织的呢?分两种情 ...

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

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

  7. [转]SQL SERVER整理索引碎片测试

    SQL SERVER整理索引碎片测试 SQL SERVER整理索引的方法也就这么几种,而且老是自作聪明的加入智能判断很不爽,还是比DBMS_ADVISOR差远了: 1SQL SERVER 2000/2 ...

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

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

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

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

随机推荐

  1. 2019CCPC秦皇岛D题 Decimal

    Decimal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  2. C++ 代码小技巧(一)

    在写代码的时候,我们常常会用一些小技巧,下面做简单介绍 一.o1+o2+o3(常数优化) 如题,开优化开关. 有的OJ上有O2优化选项,当然,你也可以这样:在代码开头这样加一句: #pragma GC ...

  3. 【重温基础】16.JSON对象介绍

    本文是 重温基础 系列文章的第十六篇. 今日感受:静. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 本章节复习的 ...

  4. [权限管理系统(四)]-spring boot +spring security短信认证+redis整合

    [权限管理系统]spring boot +spring security短信认证+redis整合   现在主流的登录方式主要有 3 种:账号密码登录.短信验证码登录和第三方授权登录,前面一节Sprin ...

  5. Vue AES+MD5加密 后台解密

    前端VUE vue项目中安装crypto-js npm install crypto-js --save-dev CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加 ...

  6. 用span写一个特殊样式的1

    用span写一个如下样式的 1 span { display: inline-block; width: 17px; height: 17px; background: var(--themeColo ...

  7. mybatis初级映射

    一 前言 系统学习知识请认准知识追寻者(同公众号),错过作者,你有可能要走好多弯路 经过第一篇的入门文章,小白们都对mybatis的搭建流程应该都很熟悉,这篇文章主讲的是如何使用mybatis实现数据 ...

  8. 《Java基础知识》Java继承的概念和实现

    继承时类和类之间的关系,是一个很简单很直观的概念,与显示生活中的继承(例如儿子继承了父亲财产)类似. 继承可以理解为一个类从另一个类中获取方法和属性的过程.如果类B继承于类A,那么类B就拥有类A的属性 ...

  9. 计算机等级考试真题1(JAVA)

    答案: 01-05 C D A A C   06-10 B/D    C C C B 11-15 A C A C A 16-20 C B     C    21-25 D D C D D 26-30 ...

  10. 虚拟化和Docker

    1.硬件层的虚拟化具有高性能和隔离性,因为hypervisor直接在硬件上运行,有利于控制VM的OS访问硬件资源,使用这种解决方案的产品有VMware ESXI和Xen server. 2.hyper ...