萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 索引使用情況監控:DMV 深度解析

兩大核心 DMV

DMV關注點核心列
sys.dm_db_index_operational_stats寫入操作統計leaf_insert_count, leaf_delete_count, leaf_update_count
sys.dm_db_index_usage_stats讀取操作統計user_seeks, user_scans, user_lookups, user_updates

查詢 1:索引寫入熱度(增刪改)

SELECT 
    OBJECT_NAME(A.[OBJECT_ID]) AS [Table Name],
    I.[NAME] AS [Index Name],
    A.LEAF_INSERT_COUNT,
    A.LEAF_UPDATE_COUNT,
    A.LEAF_DELETE_COUNT
FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL, NULL, NULL, NULL) A
INNER JOIN SYS.INDEXES I 
    ON I.[OBJECT_ID] = A.[OBJECT_ID] 
   AND I.INDEX_ID = A.INDEX_ID
WHERE OBJECTPROPERTY(A.[OBJECT_ID], 'IsUserTable') = 1
ORDER BY (A.LEAF_INSERT_COUNT + A.LEAF_UPDATE_COUNT + A.LEAF_DELETE_COUNT) DESC;

用途:識別高寫入壓力索引,評估維護成本(分裂、碎片)。

查詢 2:索引讀取模式(查找/掃描/書籤查找)

SELECT 
    OBJECT_NAME(S.[OBJECT_ID]) AS [Table Name],
    I.[NAME] AS [Index Name],
    USER_SEEKS,
    USER_SCANS,
    USER_LOOKUPS,
    USER_UPDATES
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
WHERE OBJECTPROPERTY(S.[OBJECT_ID], 'IsUserTable') = 1
ORDER BY (USER_SEEKS + USER_SCANS + USER_LOOKUPS) DESC;

結果解讀指南

模式特徵行動建議
高 Seeks、低 Scans索引高效利用維持現狀
高 Scans、低 Seeks全索引掃描,可能缺乏合適索引分析查詢計劃,考慮新增/調整索引
高 Lookups非聚簇索引回表查聚簇鍵考慮 INCLUDE 覆蓋索引
全零或極低索引從未被使用評估 DROP INDEX 釋放空間與寫入開銷
Updates 遠大於 Reads寫入成本遠高於讀取收益審視索引必要性,或延遲索引維護

關鍵限制(必讀)

  • 計數器重置:SQL Server 服務重啟時歸零
  • 僅反映緩存中元數據:若索引元數據被逐出緩存,統計會丟失
  • 不區分用戶/系統查詢:user_* 僅指非系統發起,含應用與管理員查詢

持久化監控建議

  1. 建立 Agent Job,每小時將兩個 DMV 快照寫入歷史表
  2. 配合 sys.dm_db_index_physical_stats 監控碎片率
  3. 建立儀表板:索引讀寫比、未用索引清單、高碎片索引清單

**口訣:Seeks 好、Scans 慎、Lookups 優化、Zero Drop、Updates 重。**

copyright © 萬盛學電腦網 all rights reserved