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';
子查詢過濾力最強,放最前面(解析時最後執行),大幅縮減後續掃描行數。
SELECT * 解析階段需查詢資料字典展開所有欄位名稱,額外消耗 CPU 與字典 Cache。永遠明確列出需要的欄位。
每次 SQL 執行皆涉及解析、優化、綁定、讀取塊等內部工作。合併請求可大幅降低負載。
| 方法 | SQL 往返 | 評價 |
|---|---|---|
| 兩條獨立 SELECT | 2 | 最低效 |
| PL/SQL 游標迴圈 | 2 (含開啟/關閉游標) | 次低效 |
| 單條 IN 查詢 | 1 | 最高效 |
SELECT EMP_NAME, SALARY, GRADE
FROM EMP
WHERE EMP_NO IN (342, 291);
addBatch、OCI OCIBindArrayOfStruct)一次傳送多筆 DML。RESULT_CACHE Hint 避免重複查詢熱門靜態資料。SELECT *,明確投影欄位。IN、EXISTS、批次操作減少網路往返。這三項習慣無需深諳內部機制,卻能解決 80% 以上的 SQL 效能問題。