首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 索引優化核心觀念:聚集 vs 非聚集索引結構差異與適用場景完整對照表

     編輯:關於SqlServer

一、索引結構直觀類比

聚集索引 = 字典正文

漢語字典正文按拼音排序,查「安」(an) 自然翻前頁,查「張」(zhang) 翻後頁。資料本身即按索引鍵順序儲存,無需額外查找表。一張表只能有一個聚集索引,因為資料只能依一種順序物理排列。

非聚集索引 = 部首檢字表

不認得字音時,先查部首目錄找到字,再按頁碼翻到正文。索引與資料分離,索引葉層存「書籤」 (RID 或叢集鍵) 指向實際資料列。需兩步驟:遍歷索引樹 → 書籤查找 (Key Lookup) 取回資料。

二、何時使用聚集 vs 非聚集索引 — 決策對照表

操作/場景聚集索引非聚集索引
外鍵欄位✅ 適合✅ 適合
主鍵欄位✅ 適合 (預設)✅ 適合
頻繁 ORDER BY / GROUP BY✅ 適合 (預排序)✅ 適合
範圍查詢 (BETWEEN, >, <)✅ 極佳 (連續掃描)❌ 不適合 (大量書籤查找)
低基數 (極少不同值, 如性別/狀態)✅ 適合❌ 不適合 (選擇率太低)
高基數 (大量不同值, 如身分證/交易序號)❌ 不適合 (分頁分裂嚴重)✅ 適合
頻繁 UPDATE 的欄位❌ 不適合 (資料移動成本高)✅ 適合 (只更新索引樹)
頻繁修改索引鍵值❌ 不適合✅ 適合
極少不同值 (如 Boolean/旗標)✅ 可考慮❌ 避免

三、核心原則總結

  1. 聚集索引鍵應窄、唯一、遞增 (如 Identity 整數、UUID 避免隨機 GUID)。
  2. 非聚集索引覆蓋查詢 (Covering Index) 可避免書籤查找:INCLUDE 非鍵欄位。
  3. 主鍵 ≠ 聚集索引:主鍵預設建立聚集索引,但可指定 NONCLUSTERED 分離兩者。
  4. 維護成本:每新增一個索引,INSERT/UPDATE/DELETE 皆需同步維護索引樹,權衡讀寫比例。

四、實務建議流程

  1. 識別高頻查詢與篩選欄位 (WHERE/JOIN/ORDER BY)。
  2. 評估基數分佈與資料修改頻率。
  3. 依決策表選擇索引類型與欄位組合。
  4. 使用 INCLUDE 建立覆蓋索引消除 Key Lookup。
  5. 定期監控 sys.dm_db_index_usage_stats 移除未使用索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved