在規則基礎優化器(RBO)下,Oracle 以自下而上順序解析 WHERE 子句。因此:
低效寫法(156.3 秒)
SELECT ...
FROM emp e
WHERE sal > 50000
AND job = 'MANAGER'
AND 25 < (SELECT COUNT(*) FROM emp WHERE mgr = e.empno);
高效寫法(10.6 秒)
SELECT ...
FROM emp e
WHERE 25 < (SELECT COUNT(*) FROM emp WHERE mgr = e.empno)
AND sal > 50000
AND job = 'MANAGER';
將最耗資源的子查詢條件前置,使 Oracle 先以最小結果集驅動後續過濾,大幅縮短執行時間。
使用 SELECT * 雖方便,但效能極差。Oracle 解析時需查詢資料字典將 * 展開為所有欄位名稱,額外增加解析開銷與字典存取。明確列出所需欄位不僅效能較好,程式碼可讀性與維護性也更佳。