盲目建立索引會增加寫入負擔與空間浪費。利用 sys.dm_db_missing_index_* 系列 DMV,依據查詢優化器記錄的缺失索引建議,結合成本降低幅度與編譯次數,科學決定索引建立優先順序。
SELECT
c.name AS 資料庫名,
c.equality_columns, c.inequality_columns, c.included_columns,
c.statement AS 表名,
c.avg_total_user_cost AS 平均成本降低,
c.avg_user_impact AS 百分比收益,
c.last_user_seek AS 最後尋找時間,
c.unique_compiles AS 編譯次數
FROM (
SELECT a.name, b.*
FROM (
SELECT d.*, s.avg_total_user_cost, s.avg_user_impact, s.last_user_seek, s.unique_compiles
FROM sys.dm_db_missing_index_group_stats s
JOIN sys.dm_db_missing_index_groups g ON s.group_handle = g.index_group_handle
JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
) b
JOIN sys.databases a ON a.database_id = b.database_id
) c
ORDER BY 百分比收益 DESC, 編譯次數 DESC;
| DMV 欄位 | 含義 | 決策參考 |
|---|---|---|
| equality_columns | WHERE/JOIN 等值比較欄位 | 建議放入索引鍵欄位前段 |
| inequality_columns | 範圍比較欄位 (> < >= <=) | 建議放入索引鍵欄位後段 |
| included_columns | SELECT/覆蓋查詢所需欄位 | 放入 INCLUDE 非鍵欄位 |
| avg_user_impact | 預估查詢成本降低百分比 | > 50% 高優先,> 80% 必建 |
| unique_compiles | 受益查詢編譯次數 | 次數高表示頻繁執行,優先級提升 |
ONLINE = ON。