Sql-Server

未使用的索引最佳實踐

  • January 11, 2018

基於此查詢,如果我看到總讀取量較低(非常接近 0 或 0,例如 1 或 2)和大量或中等數量的使用者更新(我無法使用此查詢找到插入或刪除)行數很大*,理論上*我應該刪除索引。

SELECT DISTINCT
   OBJECT_NAME(s.[object_id]) AS ObjectName
      , p.rows TableRows
      , i.name AS [INDEX NAME]
      , (user_seeks + user_scans + user_lookups) AS TotalReads
      , user_updates UserUpdates
FROM sys.dm_db_index_usage_stats s
   INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] 
       AND i.index_id = s.index_id 
   INNER JOIN sys.partitions p ON p.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
      AND s.database_id = DB_ID()
      AND i.name IS NOT NULL
ORDER BY (user_seeks + user_scans + user_lookups) ASC

我想在這裡交叉檢查這個假設的準確性。例如,一個已經存在一年多但從未閱讀過但高度更新的索引似乎是一個壞主意。是否存在這種假設無效的情況?

此 DMV 僅維護自上次 SQL Server 重新啟動以來的統計資訊;視圖完全消失了,一切都從頭開始。

更重要的是,該視圖中任何特定索引的行在重建該索引時都會被刪除(但不是在重組時)。如果您正在執行定期索引維護,查看維護日誌並查看您正在考慮刪除的任何索引是否最近可能已重建可能會很有用。

因此,根據自上次重啟以來的低讀數做出決定,當上次重啟可能是針對上週的更新檔週二更新或昨天的服務包時,可能是不明智的。或者當您執行索引維護時,自上次重建以來。可能有一份報告只執行一次,或者每季度執行一次,或者每年執行一次,並且它是由一個重要且不耐煩的人執行的。

此外,您可能不知道將來會發生的事情的索引 - 比如說,正在為稅收季節準備的一系列報告。

所以,我的建議是:

使用 DMV 來辨識要刪除的候選索引,但不要在泡沫中做出決定 - 您需要在刪除索引之前做一些工作以確定為什麼索引可能存在,即使它看起來目前沒有被使用.

引用自:https://dba.stackexchange.com/questions/128160