索引是關聯式資料庫提升查詢效能的關鍵工具,但「索引越多越好」是迷思。本文深入解析 SQL Server 索引類型、建立策略與效能調校核心原則。
索引改變資料組織方式,使資料依相似結構排列,避免全表掃描。索引依欄位建立,透過索引欄位值快速定位資料。
| 類型 | 特性 | 適用場景 |
|---|---|---|
| Clustered 索引 (叢集索引) | 資料依物理順序儲存,每表僅能有一個 | 範圍查詢、排序需求、頻繁依特定欄位排序 |
| Nonclustered 索引 (非叢集索引) | 不影響物理儲存,由資料列指標組成;若有 clustered 索引,指標指向 clustered 索引鍵值 | 精確查找、連接欄位、WHERE 條件欄位 |
CREATE INDEX 陳述式或企業管理員索引建立精靈優先使用 int、bigint、smallint、tinyint 等定長數值型別:佔用空間固定、比較運算極快。避免 char、varchar 作為索引鍵:可變長度、比較成本高、不適合數學運算。
查詢中對索引欄位套用函數、隱含轉換會導致索引失效。錯誤範例:WHERE CONVERT(varchar, DateCol) = '2024-01-01' → 索引無法使用。正確寫法:WHERE DateCol = '2024-01-01' 或範圍查詢。
資料庫依第一欄排序,再依第二欄細分...。選擇性最高(唯一值最多)的欄位放最前面,以便快速縮小搜尋範圍。
Clustered 索引鍵值會複製到所有 Nonclustered 索引作為書籤。Clustered 鍵值越大 → Nonclustered 索引越大 → 儲存空間與搜尋時間增加。建議:窄、唯一、不常更新的欄位(如身分證字號、流水號)。
Nonclustered 索引依賴 Clustered 索引鍵值定位。Clustered 鍵值異動 → 所有 Nonclustered 索引的書籤必須同步更新 → 大量寫入負擔。
DBCC SHOWCONTIG 或 sys.dm_db_index_physical_stats 檢查碎片FILLFACTOR 預留空間減少分頁分裂sys.dm_db_missing_index_*) 發現潛在索引需求