SQL Server獲取索引創建時間&重建時間&重組時間

来源:https://www.cnblogs.com/kerrycode/archive/2019/10/22/11720937.html
-Advertisement-
Play Games

之前寫過一篇博客“SQL Server中是否可以準確獲取最後一次索引重建的時間?“,裡面主要講述了三個問題:我們能否找到索引的創建時間?最後一次索引重建(Index Rebuild)的時間? 最後一次索引重組(INDEX REORGANIZE)的時間呢?,當時得出的結論,答案是我們無法準確的找到索引... ...


之前寫過一篇博客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值,也無從判斷。所以這裡能記錄準確的時間,但是無法區分索引重建與索引重組。

 

 

clip_image001

 

 

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

 

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/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL的安裝 (4,5,6可省略) 聲明:CentOS版本為7.6,安裝的MySQL版本為8.0.17 1. 首先要卸載掉本機自帶的mysql相關,包括MariaDB。 shell rpm pa | grep mysql 將搜到的結果使用 刪除掉,沒有就跳過 rpm pa | grep mari ...
  • 系統環境: NFS伺服器操作系統: ubuntu18.04 server lts NFS伺服器IP: 192.168.1.164 註: NFS伺服器 指的是 待安裝 NFS服務 的機器(物理機或者虛擬機) 步驟如下: 1. 先更新 2. 安裝 NFS服務 (此時該服務已設置開機自啟動) 3.修改配置 ...
  • 安裝python3(編譯安裝) 1. 下載python安裝包到指定目錄 這裡的目錄如果不存在可以自己建,當然也可以自己放在自己想放的位置,只要等會兒安裝的時候能找到就行。 2.確保已經安裝了gcc編譯器(一般預設有的) 3.下載python安裝包,這裡選擇的是gz格式的壓縮包 4. 解壓安裝包 5. ...
  • 直接上代碼: curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com ...
  • 第一步: 添加GitLab的官方存儲庫: curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash 第二步: 安裝最新版本的GitLab Runner ...
  • top n:選出查詢結果的前n項,可改為 top n percent 形式:選出查詢結果的前百分之n項; inner join:內連接查詢,可改為left join(左連接)、right join(右連接); ...
  • DCL(Data Control Language)語句:數據控制語句,用於控制不同數據段直接的許可和訪問級別的語句。這些語句定義了資料庫、表、欄位、用戶的訪問許可權和安全級別。 ...
  • mysql查看資料庫性能常用命令 mysql> show global status; 可以列出MySQL伺服器運行各種狀態值,另外,查詢MySQL伺服器配置信息語句: mysql> show variables; 一、慢查詢 mysql> show variables like '%slow%'; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...