對索引欄位使用 OR 會導致全表掃描。僅當所有 OR 條件欄位皆有索引時,UNION 改寫有效:
-- 高效:UNION 可分別使用 LOC_ID、REGION 索引
SELECT loc_id, loc_desc, region FROM location WHERE loc_id = 10
UNION
SELECT loc_id, loc_desc, region FROM location WHERE region = 'MELBOURNE';
-- 低效:OR 導致全表掃描
SELECT loc_id, loc_desc, region FROM location WHERE loc_id = 10 OR region = 'MELBOURNE';
注意:若任一欄位無索引,UNION 改寫反而可能降低效能。
-- 低效
SELECT ... FROM location WHERE loc_id = 10 OR loc_id = 20 OR loc_id = 30;
-- 高效 (8i+ 執行計劃通常相同,但可讀性更好)
SELECT ... FROM location WHERE loc_id IN (10, 20, 30);
WHERE idx_col IS NULL 必須全表掃描NVL(idx_col, '特殊值') + 函數索引,或設計預設值避免 NULLCREATE INDEX idx_ab ON t(a, b)| 操作 | UNION | UNION ALL |
|---|---|---|
| 合併邏輯 | 合併 → 排序 → 去重 | 直接合併,保留重複 |
| 記憶體 | 使用 SORT_AREA_SIZE 排序 | 無排序,記憶體壓力小 |
| 結果 | 不重複 | 可能重複 |
| 適用場景 | 業務要求去重 | 業務允許重複、或已知無重複 |