索引是 SQL Server 性能的雙刃劍。本文系統梳理三大索引類型的選型原則、適用場景與維護策略。
聚簇索引:物理順序的唯一主宰
- 每表僅一個,數據頁按鍵值物理有序
- 必建場景:高併發尾頁競爭、範圍查詢、GROUP BY/ORDER BY
- 禁忌:單調遞增鍵(Identity)導致熱點、頻繁修改列導致行移動
- 候選:主鍵(隨機插入)、範圍列、排序列、低修改列、連接列
非聚簇索引:邏輯順序的多路索引
- 默認類型,數據不重組,葉級存指針(RID/聚簇鍵)
- 無聚簇索引時最多 250 個
- 權衡:查詢加速 vs DML 開銷(每非聚簇索引均需維護指針)
- 適用:聚合函數列、JOIN/ORDER BY/GROUP BY 列、選擇性高(≤20%)列
覆蓋索引:查詢全覆蓋的零回表索引
- 非聚簇索引包含查詢所有所需列
- 優勢:不回表,速度超聚簇索引
- 代價:空間大、UPDATE 連鎖修改
- 原則:僅對高頻關鍵查詢建立,非核心查詢不值得
維護三板斧
- 碎片整理:
ALTER INDEX ... REORGANIZE (5-30%) / REBUILD (>30%),線上/離線選擇
- 統計更新:
UPDATE STATISTICS / sp_updatestats,配合 AUTO_UPDATE_STATISTICS
- 缺失/冗余分析:DMV
dm_db_missing_index_details、dm_db_index_usage_stats 定期巡檢
索引設計黃金法則
「基於查詢負載設計索引,而非基於表結構。」—— 捕獲真實工作負載(Profiler/Extended Events/Query Store),分析執行計劃缺失索引提示,迭代優化,而非憑直覺建索引。