針對 Oracle 執行計畫特性,分析常見操作符的效能陷阱,提供具體改寫方案,涵蓋 IN、NOT IN、<>、IS NULL、>、<、LIKE 等核心場景。
| 操作符/場景 | 問題 | 推薦改寫方案 |
|---|---|---|
| IN | 需轉換為多表連接,至少多一轉換步驟;含群組統計時無法轉換 | 業務密集 SQL 盡量避免 IN,改用 EXISTS 或 JOIN |
| NOT IN | 無法使用索引,全表掃描 | 改用 NOT EXISTS 或 (LEFT JOIN + IS NULL 判斷) |
| <> (不等於) | 永不使用索引,全表掃描 | a<>0 → a>0 OR a<0;a<>'' → a>'' |
| IS NULL / IS NOT NULL | B-Tree 索引不存儲空值,無法用索引 | 改用 a>0 或 a>'';或設 NOT NULL + 預設值;或建位圖索引 (注意並發鎖問題) |
| > / < | 通常走索引,但值分布極不均時可優化 | 如 A>2 需先找 =2 再比較,A>=3 直接定位 =3,優先用 >=/<= 精確邊界 |
| LIKE | % 開頭無法用索引 | LIKE '%5400%' → 改寫為 LIKE 'X5400%' OR LIKE 'B5400%' 利用前綴索引 |
原查詢:YY_BH LIKE '%5400%' → 全表掃描。
優化:YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%' → 利用 YY_BH 索引進行兩次範圍掃描,效能大幅提升。