查詢計畫出現 Key Lookup (Bookmark Lookup/RID Lookup) 表示非叢集索引未覆蓋查詢欄位,需回叢集索引/堆表取值,造成額外 I/O。本文示範兩種移除方案並比較效能。
Sales.Orders 有叢集索引 orderidSELECT orderid, shipaddress, shipregion FROM Sales.Orders WHERE shipcity = '深圳'IX_shipcity(shipcity) → 產生 Key Lookup 取 shipaddress, shipregionCREATE NONCLUSTERED INDEX IX_cover ON Sales.Orders(shipcity, orderid, shipaddress, shipregion)
⚠️ 欄位順序關鍵:篩選欄位必須在最前,否則退化為索引掃描。
CREATE NONCLUSTERED INDEX IX_include ON Sales.Orders(shipcity) INCLUDE(orderid, shipaddress, shipregion)
✅ 鍵欄僅存篩選欄,體積較小、維護成本低,查詢同樣避免 Lookup。
| 指標 | 覆蓋索引 | INCLUDE 索引 | 叢集索引掃描 |
|---|---|---|---|
| 查詢開銷 | 0.0032 | 0.0032 | 0.0041 |
| 邏輯讀取 | 8 | 8 | 124 |
| 索引大小 | 較大 | 較小 | 基準 |
移除 orderid 重測,開銷不變。結論:非叢集索引隱含叢集索引鍵,無需重複宣告。
sys.dm_db_index_usage_stats 移除未使用索引精準設計索引,消除 Lookup,是查詢調優最高 ROI 的動作之一。