傳統觀點認為 WHERE 條件順序影響查詢效能,特別是舊版 Oracle (Rule-based Optimizer 時代)。本文透過 Oracle 10g 實測,驗證在 CBO (Cost-Based Optimizer) 模式下,條件順序是否仍影響執行計畫。
SELECT *
FROM hr.COUNTRIES c, hr.REGIONS r
WHERE c.REGION_ID = r.REGION_ID
AND c.REGION_ID = '4';
SELECT *
FROM hr.COUNTRIES c, hr.REGIONS r
WHERE c.REGION_ID = '4'
AND c.REGION_ID = r.REGION_ID;
| 指標 | 方式 1 | 方式 2 |
|---|---|---|
| Plan Hash Value | 4030513296 | 4030513296 |
| Operations | NESTED LOOPS → INDEX UNIQUE SCAN (REGIONS) → INDEX FULL SCAN (COUNTRIES) | 完全相同 |
| Predicate Access | "R"."REGION_ID"=4 (access), "C"."REGION_ID"=4 (filter) | 完全相同 |
| Consistent Gets | 127 | 131 |
| Physical Reads | 20 | 22 |
| Recursive Calls | 628 | 656 |
DBMS_STATS.GATHER_TABLE_STATS)、索引設計、SQL 寫法規範 (使用 ANSI JOIN 語法)/*+ ORDERED */ 或 /*+ LEADING */ Hint 強制連接順序V$SQL_PLAN 驗證實際執行計畫現代 Oracle 優化器已足夠智能,開發者應將精力投入於統計維護、索引策略與業務邏輯優化,而非條件順序微調。