優化器對不同運算子的索引利用能力差異極大,**理解運算子語意與執行計畫影響,是 SQL 改寫的基石**。
EXISTS 或直接連接。NOT EXISTS 或 OUTER JOIN ... WHERE IS NULL。<>、!=、^= **永不使用索引** → 全表掃描。a <> 0 → a > 0 OR a < 0(可用索引範圍掃描)。a <> '' → a > ''(字串)。a IS NOT NULL → a > 0(數值)、a > ''(字串)。NOT NULL + 預設值(如狀態預設 'NEW')。A > 2:優化器先定位 2 的索引區間再過濾。A >= 3:直接定位 3 的索引區間,**效率顯著更高**。LIKE '%abc%':前導萬用字元 → **索引失效**,全表掃描。LIKE 'abc%':後置萬用字元 → **索引範圍掃描**有效。YY_BH LIKE '%5400%' 全掃描 → 已知前綴為 'X' 或 'B' → 改為 YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%',**雙範圍掃描替代全掃描**,效能提升數量級。REVERSE(col))、反向鍵索引。| 原寫法 | 優化寫法 | 適用條件 |
|---|---|---|
| IN (子查詢) | EXISTS / JOIN | 高頻核心 SQL |
| NOT IN | NOT EXISTS / OUTER JOIN IS NULL | 所有場景 |
| col <> val | col > val OR col < val | 數值/日期欄位有索引 |
| col IS NOT NULL | col > 0 / col > '' + NOT NULL 約束 | 業務允許 |
| col > 2 | col >= 3 | 邊界值為離散常數 |
| LIKE '%str%' | LIKE 'prefix%' OR Function-based Index | 已知前綴模式 |
SQL 優化始於**運算子選擇**:拒絕 NOT IN、<>、前導 LIKE;善用 EXISTS、範圍邊界、Function-based Index。結合執行計畫驗證,將「寫得對」升級為「寫得快」。