经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server获取索引创建时间&重建时间&重组时间
来源:cnblogs  作者:潇湘隐者  时间:2019/10/23 8:50:00  对本文有异议

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

 

 

 

索引的创建时间

 

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

 

 

  1. DECLARE @filename VARCHAR(500)
  1. SELECT @filename = CAST(value AS VARCHAR(500))
  1. FROM fn_trace_getinfo(DEFAULT)
  1. WHERE property = 2
  1.   AND value IS NOT NULL 
  1.  
  1. -- Go back 4 files since default trace only keeps the last 5 and start from there.
  1. 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'
  1.  
  1. SELECT 
  1.        gt.EventClass,
  1.        gt.EventSubClass,
  1.        te.Name AS EventName,
  1.        gt.HostName,
  1.        gt.StartTime,
  1.        gt.DatabaseName,
  1.        gt.ObjectName,
  1.        gt.IndexID
  1. FROM fn_trace_gettable(@fileName, DEFAULT) gt
  1. JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id
  1. WHERE EventClass = 46
  1.   and ObjectType = 22601
  1.   and gt.DatabaseName <> 'tempdb'
  1. ORDER BY StartTime desc;

 

 

 

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

 

 

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

 

 

clip_image001

 

 

  1. DECLARE @filename VARCHAR(500)
  1. SELECT @filename = CAST(value AS VARCHAR(500))
  1. FROM fn_trace_getinfo(DEFAULT)
  1. WHERE property = 2
  1.   AND value IS NOT NULL 
  1.  
  1. -- Go back 4 files since default trace only keeps the last 5 and start from there.
  1. 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'
  1.  
  1. SELECT 
  1.        gt.EventClass,
  1.        gt.EventSubClass,
  1.        te.Name AS EventName,
  1.        gt.HostName,
  1.        gt.StartTime,
  1.        gt.DatabaseName,
  1.        gt.ObjectName,
  1.        gt.IndexID
  1. FROM fn_trace_gettable(@fileName, DEFAULT) gt
  1. JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id
  1. WHERE EventClass = 164
  1.   and ObjectType = 22601
  1.   and gt.DatabaseName <> 'tempdb'
  1. ORDER BY StartTime desc;
  1.  

 

 

测试验证如下所示:

 

  1. USE YourSQLDba;
  1. GO
  1. ALTER INDEX Pk_HistMaintTrav ON [Maint].[JobHistory] REBUILD;
  1.  
  1. ALTER INDEX PK_DataBaseSizeDtl_Day ON [Maint].[DataBaseSizeDtl_Day] REORGANIZE;
  1.  
  1. CREATE INDEX IX_DataBaseSizeDtl_Day_N1 ON [Maint].[DataBaseSizeDtl_Day](DataBaseName);

 

clip_image002

 

clip_image003

 

 

注意:上面脚本在有些环境可能会出错,主要是因为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/

原文链接:http://www.cnblogs.com/kerrycode/p/11720937.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号