索引是加速查詢的利器,但「天下沒有免費的午餐」。盲目建立索引反而拖垮寫入效能、佔用空間、增加維護負擔。本文提煉六大索引管理鐵律,助您建立科學的索引策略,在查詢加速與系統開銷間找到最佳平衡點。
策略:以工作負載為導向,僅為高頻、高成本查詢建立索引;定期用 sys.dm_db_index_usage_stats 識別未使用索引並移除。
FILTERED INDEX (WHERE 子句限定熱門值)、複合索引前導欄位、INCLUDE 覆蓋索引。OrderDate),資料物理順序即邏輯順序,效能最優。TOP N 限制回傳筆數,避免大範圍掃描回傳海量資料給應用層。
-- 範例:WHERE Status = 1 AND OrderDate BETWEEN '2023-01-01' AND '2023-12-31' AND CustomerId = 100
-- 最佳索引順序:(Status, CustomerId, OrderDate)
-- Status: 等值、高選擇性 (假設)
-- CustomerId: 等值、高選擇性
-- OrderDate: 範圍、置於最後
=, IN) 可精確定位索引區間。>, <, BETWEEN, LIKE 'abc%') 只能用於索引前導欄位已定位後的後續掃描。INCLUDE 欄位雖不參與排序,但佔用索引頁面空間,增加寫入 I/O、記憶體壓力、備份體積。avg_fragmentation_in_percent > 30% → REBUILD (ONLINE=ON);5-30% → REORGANIZE。UPDATE STATISTICS 或 sp_updatestats。sys.dm_db_index_usage_stats 追蹤 user_seeks, user_scans, user_lookups,長期為 0 的索引候選移除。sys.dm_db_missing_index_* DMV 提供最佳化器建議,但需人工驗證合併相似建議、評估寫入影響。
新查詢效能問題
↓
分析執行計畫 (Missing Index Hint / Scan / Key Lookup)
↓
識別核心篩選/聯結/排序欄位
↓
評估欄位選擇性、查詢頻率、寫入頻率
↓
設計索引 (單欄/複合/覆蓋/篩選) → 測試環境驗證執行計畫變化
↓
上線 → 納入維護排程 (重建/統計/監控)
↓
定期審視使用率 → 移除無效索引