SQL Server 採用 B+ 樹 結構組織索引:根節點 → 中間層 → 葉子層。聚簇索引葉子層直接包含數據行(數據即索引);非聚簇索引葉子層包含索引鍵值 + 行定位器(聚簇索引鍵或 RID)。優化器基於統計信息估算代價,決定掃描、查找或覆蓋索引。
BETWEEN, >, <)、ORDER BY/GROUP BY 聚簇鍵時極其高效——葉子頁物理連續,預讀效果最佳。PAGELATCH_EX 熱點。| 優先級 | 特徵 | 典型場景 |
|---|---|---|
| 1️⃣ | 唯一、窄、穩定、遞增(或可控分散) | 主鍵 ID、唯一業務流水號 |
| 2️⃣ | 高頻範圍掃描、排序、分組列 | 訂單日期、創建時間 |
| 3️⃣ | 高頻 JOIN 關聯列 | 外鍵 CustomerID、ProductID |
VARCHAR(200))、複合鍵超過 900 字節限制。NEWSEQUENTIALID()、哈希分區、或反轉字節序列。WHERE UserID = 123)。ORDER BY/GROUP BY 非聚簇鍵場景。每次 INSERT/UPDATE/DELETE 需同步維護所有非聚簇索引。寫多讀少的表嚴格控制索引數量;讀多寫少的報表表可大膽創建覆蓋索引。
-- 查詢:SELECT OrderID, Amount FROM Orders WHERE CustomerID = 100 AND OrderDate > '2024-01-01';
CREATE INDEX IX_Orders_Cust_Date_Cover ON dbo.Orders (CustomerID, OrderDate) INCLUDE (OrderID, Amount);
優化器直接掃描索引葉子層即可滿足查詢,零回表、零聚簇索引查找。但維護成本隨 INCLUDE 列數增長而上升,需評估「查詢頻率 × 性能收益」vs「寫入開銷」。
sys.dm_exec_query_stats、Query Store、Extended Events 捕獲高頻/高耗時查詢。Missing Index 提示、Key Lookup、Index Scan、Sort 操作符。DBCC AUTOPILOT 或測試環境驗證。sys.dm_db_index_usage_stats 監控 user_seeks/user_scans/user_lookups vs user_updates。FILLFACTOR。| 碎片類型 | 定義 | 閾值建議 | 處置 |
|---|---|---|---|
| 邏輯碎片 | 葉子頁邏輯順序與物理順序不一致 | > 30% | REBUILD (ONLINE=ON) |
| 頁密度低 | 頁填充度低(大量刪除/更新導致) | AVG_PAGE_SPACE_USED < 70% | REBUILD 或調整 FILLFACTOR |
REBUILD 重建統計信息、壓縮頁、恢復填充因子。ONLINE = ON,不阻塞用戶查詢。AUTO_UPDATE_STATISTICS_ASYNC ON 避免查詢等待統計更新;大表啟用 PERSIST_SAMPLE_PERCENT 固定採樣率。user_seeks/scans/lookups 使用的索引 → 定期清理(保留 30 天無訪問則評估刪除)。將聚簇索引(數據)放在 PRIMARY 文件組(高速 SSD),非聚簇索引放在 INDEX_FG 文件組(另一組 SSD/HDD),利用並行 I/O 通道提升吞吐。CREATE INDEX ... ON [INDEX_FG] 即可指定。
索引設計是「讀寫權衡」的藝術。建立基線→監控→診斷→優化→驗證的閉環機制,讓索引真正成為查詢性能的加速器,而非維護負擔的來源。