Oracle 優化器對 WHERE 子句採用自下而上解析順序。理解此機制,將連接條件前置、高選擇性過濾條件後置,可顯著降低中間結果集,提升查詢效能。
SELECT ...
FROM emp e
WHERE sal > 50000
AND job = 'MANAGER'
AND 25 < (SELECT COUNT(*) FROM emp WHERE mgr = e.empno);
執行流:全表掃描 EMP → 過濾 SAL/JOB → 執行相關子查詢 → 最後過濾管理人數
SELECT ...
FROM emp e
WHERE 25 < (SELECT COUNT(*) FROM emp WHERE mgr = e.empno)
AND sal > 50000
AND job = 'MANAGER';
執行流:先算子查詢(管理人數<25 過濾掉大部分鋪員) → 再過濾 SAL/JOB → 結果集大幅縮小
| 準則 | 說明 | 反例 | 正例 |
|---|---|---|---|
| 避免 SELECT * | 解析階段需查數據字典展開列名,增加開銷 | SELECT * FROM emp | SELECT empno, ename FROM emp |
| 使用表別名 | 多表連接時消除列歧義,減少解析時間 | SELECT ename FROM emp, dept WHERE emp.deptno=dept.deptno | SELECT e.ename FROM emp e, dept d WHERE e.deptno=d.deptno |
| 列歧義 | 多表同名列未加前綴導致解析報錯 | SELECT deptno FROM emp, dept | SELECT e.deptno FROM emp e, dept d |
EXPLAIN PLAN / DBMS_XPLAN.DISPLAY 驗證實際執行順序DBMS_STATS.GATHER_TABLE_STATS 讓優化器決策更準確SQL 優化無銀彈,但遵循「連接前置、高選擇性後置、顯式列名、表別名」四大鐵律,能解決 80% 以上性能問題。