複合索引 `(A, B, C)` 的 B 樹導航依賴前綴匹配。WHERE 條件雖順序不影響邏輯結果,但**寫法順序影響優化器統計資訊使用與計畫穩定性** (特別是舊版/參數嗅探場景)。習慣按索引順序寫:`WHERE A=@a AND B=@b AND C=@c`。
程式碼 `foreach` 迴圈呼叫 `IF EXISTS` → N 次往返。重構:在表上建立複合索引覆蓋 `EXISTS` 條件欄位,將迴圈邏輯下推為單一 `MERGE`/`INSERT...SELECT...WHERE NOT EXISTS`。`IF NOT EXISTS` 改寫為 `IF EXISTS` 以利用索引 (NOT EXISTS 易導致掃描)。
| 回傳量 | 效能排序 (佳 → 差) |
|---|---|
| 多列 (大結果集) | 索引覆蓋 > 叢集索引掃描 > 表掃描 > 堆積非叢集索引 > 叢集非叢集索引 |
| 少列 (小結果集) | 索引覆蓋 = 叢集索引尋找 > 堆積非叢集索引 > 叢集非叢集索引 > 表掃描 |
解讀:叢集表非叢集索引雙重 B 樹 (Key Lookup) 代價高,大結果集下甚至劣於表掃描。**覆蓋索引一統江湖**。
分頁查詢必加 `OFFSET ... ROWS FETCH NEXT ... ROWS ONLY` (SQL 2012+) 或 `TOP`。避免全表掃描傳回海量資料導致 OOM/Timeout。
查詢寫作不是隨意拼湊,而是**依索引設計反推條件結構、欄位投影、分頁邏輯**的工程紀律。牢記:索引決定查詢形態,查詢驗證索引價值。雙向對齊,才是高效 SQL 的秘訣。