| 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 |
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;
用途:識別高寫入壓力索引,評估維護成本(分裂、碎片)。
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 | 寫入成本遠高於讀取收益 | 審視索引必要性,或延遲索引維護 |
user_* 僅指非系統發起,含應用與管理員查詢sys.dm_db_index_physical_stats 監控碎片率**口訣:Seeks 好、Scans 慎、Lookups 優化、Zero Drop、Updates 重。**