NONCLUSTERED)。代碼證明:PRIMARY KEY NONCLUSTERED (Id) 合法,主鍵不聚集,另建聚集索引於他列。
表 T(c1, c2, c3),對比:
CREATE INDEX IX_123 ON T(c1, c2, c3);(多列索引,順序 c1→c2→c3)CREATE INDEX IX_1 ON T(c1); CREATE INDEX IX_2 ON T(c2); CREATE INDEX IX_3 ON T(c3);(三個單列索引)| 查詢模式 | Case 1 多列索引 | Case 2 單列索引 | 解析 |
|---|---|---|---|
| WHERE c1 = ? | ✅ 索引查找 | ✅ 索引查找 | 單列均可 |
| WHERE c2 = ? | ❌ 掃描(非前導列) | ✅ 索引查找 | 多列索引需滿足最左前綴 |
| WHERE c1=? AND c2=? | ✅ 索引查找 | 🤔 索引合併/單列查找+回表 | 多列索引更優 |
| WHERE c1=? AND c2=? AND c3=? | ✅ 完美覆蓋 | 🤔 合併/回表 | 多列索引完勝 |
| WHERE c2=? AND c3=? AND c1=? | ❌ 順序錯誤→掃描 | ✅ 單列索引各自查找 | 多列索引嚴格依賴順序 |
查詢所需列全部包含在索引鍵或 INCLUDE 列中,優化器直接掃描索引葉級,無需 Key Lookup。
CREATE INDEX IX_Order_Cover ON Orders (CustomerID, OrderDate) INCLUDE (TotalAmount, Status);
-- 查詢:SELECT CustomerID, OrderDate, TotalAmount FROM Orders WHERE CustomerID = 123;
-- 直接命中索引,零回表
IX_c1、IX_c2、IX_c3 合併為 IX_c1_c2_c3(按查詢頻率/選擇性排序),測試顯示寫入性能提升 30-50%。sys.dm_db_index_usage_stats 監控 user_seeks + user_scans + user_lookups = 0 的索引(保留足夠觀察期,如 30 天)。FILLFACTOR = 80-90 減少頁分裂。DATA_COMPRESSION = PAGE 節省空間、減少 I/O。