Oracle 採用自下而上的關聯順序解析 WHERE 子句。因此:
SELECT ...
FROM EMP E
WHERE SAL > 50000
AND JOB = 'MANAGER'
AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR = E.EMPNO);
SELECT ...
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR = E.EMPNO)
AND SAL > 50000
AND JOB = 'MANAGER';
原理:子查詢先過濾掉大部分非管理者記錄,再套用薪資與職稱條件,大幅減少掃描量。
動態 SQL 列引用 * 會在解析階段查詢資料字典轉換所有欄位名,增加 CPU 與 I/O 開銷。永遠明確列出所需欄位。
每條 SQL 執行伴隨:解析、索引利用率估算、綁定變數、讀取資料塊等內部工作。
SELECT EMP_NAME, SALARY, GRADE FROM EMP WHERE EMP_NO = 342;
SELECT EMP_NAME, SALARY, GRADE FROM EMP WHERE EMP_NO = 291;
DECLARE
CURSOR C1(E_NO NUMBER) IS SELECT EMP_NAME,SALARY,GRADE FROM EMP WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342); FETCH C1 INTO ...;
OPEN C1(291); FETCH C1 INTO ...;
CLOSE C1;
END;
SELECT EMP_NAME, SALARY, GRADE FROM EMP WHERE EMP_NO IN (342, 291);
單次網路往返、單次解析、單次執行計畫生成,效能最優。
EXPLAIN PLAN 分析執行計畫,關注 CARDINALITY 與 COST