開發初期資料量小不易發現效能差異;上線後資料增長,劣質 SQL 與優質 SQL 速度可差百倍。優化器依統計資訊與索引決定執行計劃,WHERE 子句寫法直接影響索引是否被使用。
| # | 陷阱 | 失效範例 | 索引友善寫法 |
|---|---|---|---|
| 1 | IS NULL / IS NOT NULL | WHERE status IS NULL | 避免索引欄存 NULL;改用預設值或函數索引 |
| 2 | 欄位聯接運算 | WHERE first_name||last_name='BillClinton' | WHERE first_name='Bill' AND last_name='Clinton' |
| 3 | 前置萬用字元 LIKE | WHERE name LIKE '%clinton%' | WHERE name LIKE 'clinton%' (後置可用索引) |
| 4 | ORDER BY 非索引/運算式 | ORDER BY sal*12 | 改用索引欄;或建立函數索引 |
| 5 | NOT / <> 運算子 | WHERE salary <> 3000 | WHERE salary < 3000 OR salary > 3000 |
| 6 | IN 子查詢 | WHERE id IN (SELECT ...) | WHERE EXISTS (SELECT 'X' FROM ...) — 相關子查詢可提早終止 |
NOT EXISTS 優於 NOT INDBMS_STATS)EXPLAIN PLAN 確認執行計劃