在 Oracle 資料庫效能調校中,理解「驅動表」的選擇機制至關重要。成本基礎優化器(CBO)依賴統計資訊來決定最佳的連接順序與驅動表;若缺乏統計資訊,CBO 會預設採用 FROM 子句中從左到右的順序選擇驅動表,這與規則基礎優化器(RBO)的右到左順序截然不同。
CBO 透過計算各種連接路徑的成本,挑選代價最低的執行計畫。當資料字典中存在完整統計資訊(經過 ANALYZE 或 DBMS_STATS 收集)時,優化器會自動根據 Cost 值決定連接類型(Nested Loops、Hash Join、Sort Merge Join)及驅動表,此時 WHERE 子句中條件的先後順序不再影響決策。若需人為干預,則必須使用 Hints。
透過建立三張測試表(A、B、C)及索引,執行多表連接查詢並觀察執行計畫,可驗證:若在 CBO 模式下加上 /*+ ORDERED */ 提示,Oracle 確實會依 FROM 子句順序(B → A → C)選擇驅動表。這證明了 Hint 能有效覆寫優化器的預設決策。
CREATE TABLE A (col1 NUMBER(4), col2 NUMBER(4), col4 CHAR(30));
CREATE TABLE B (col1 NUMBER(4), col3 NUMBER(4), name_b CHAR(30));
CREATE TABLE C (col2 NUMBER(4), col3 NUMBER(4), name_c CHAR(30));
CREATE INDEX inx_col12A ON A(col1, col2);
SELECT /*+ ORDERED */ A.col4
FROM B, A, C
WHERE B.col3 = 10
AND A.col1 = B.col1
AND A.col2 = C.col2
AND C.col3 = 5;
ORDERED Hint 可強制指定連接順序,但需謹慎使用,避免導致效能退化。