RBO 依 FROM 子句**從右往左**解析,最後寫的表 (Driving Table) 優先存取。原則:**小表驅動大表**。
-- TAB1: 16,384 列, TAB2: 1 列
SELECT COUNT(*) FROM tab1, tab2; -- 0.96 秒 (TAB2 驅動)
SELECT COUNT(*) FROM tab2, tab1; -- 26.09 秒 (TAB1 驅動)
三表以上:選擇 **Intersection Table** (被其他表參考的表) 作為驅動表。
RBO **自下而上**解析 WHERE 條件:
-- 低效 (156 秒)
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';
最佳實務: 明確列出所需欄位。
每次 SQL 執行皆涉及:解析、綁定、執行計畫、Fetch、網路往返。
| 方法 | 描述 | 效率 |
|---|---|---|
| 多條獨立 SQL | 分開查詢 empno=342、empno=291 | 最低 |
| PL/SQL Cursor 迴圈 | OPEN/FETCH/CLOSE 多次 | 中等 |
| 單一 SQL 多表自連接 | SELECT a.*, b.* FROM emp a, emp b WHERE a.empno=342 AND b.empno=291 | 最高 |
ARRAYSIZE (SQL*Plus/Forms/Pro*C):預設 15,建議設 100~200,減少 Fetch 往返SET AUTOTRACE TRACEONLY EXPLAIN:快速查看執行計畫EXPLAIN PLAN + DBMS_XPLAN.DISPLAY:詳細分析上述規則 4、5 僅在 **Rule-Based Optimizer (RBO)** 下有效。現代 Oracle (10g+) 預設 **Cost-Based Optimizer (CBO)**,依統計資訊自動決定連接順序與條件評估順序,**無需手工調整 SQL 寫法順序**。重點應放在:
DBMS_STATS)LEADING, ORDERED) 引導