執行計劃是 CBO 決策的透明化輸出。本文透過兩個實戰案例,系統講解如何閱讀計劃樹結構、識別優化器模式、判定驅動表順序、分析連接方法選擇,並示範 ORDERED Hint 強制最佳路徑。
SQL> SELECT * FROM large_table WHERE username = 'TEST';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1234 Card=1 Bytes=14)
1 TABLE ACCESS FULL LARGE_TABLE [:Q65001] [ANALYZED]
關鍵指標解讀:
Optimizer=CHOOSE:參數模式,非實際使用模式Cost=1234:有 Cost 值 → **實際使用 CBO** (RBO 無 Cost)TABLE ACCESS FULL:全表掃描,無索引可用[:Q65001]:並行查詢 Slave 進程標識[ANALYZED]:物件有統計資訊,CBO 可用判斷規則:Cost= 顯示數值 → CBO;Cost= 空白或無 Cost 行 → RBO。
SELECT A.col4
FROM A, B, C
WHERE B.col3 = 10
AND A.col1 = B.col1
AND A.col2 = C.col2
AND C.col3 = 5;
-- 索引:A(col1, col2) 組合索引,col1 為導引欄位
執行計劃 (去除 INDEX 縮進後):
| Id | Operation | Name |
|----|--------------------------|----------|
| 0 | SELECT STATEMENT | |
| 1 | MERGE JOIN | |
| 2 | SORT JOIN | |
| 3 | NESTED LOOPS | |
| 4 | TABLE ACCESS FULL | B | <-- 最右最上:驅動表 B
| 5 | TABLE ACCESS BY INDEX ROWID| A |
| 6 | SORT JOIN | |
| 7 | TABLE ACCESS FULL | C |
| 候選表 | 過濾條件 | 預估結果集 | 索引利用 | 評估 |
|---|---|---|---|---|
| B | col3 = 10 | 小 (高選擇性) | 連接 A.col1 = B.col1 → 使用 A 組合索引導引欄位 | ✓ 最佳 |
| C | col3 = 5 | 小 | 連接 A.col2 = C.col2 → 非導引欄位,索引效率差 | ✗ 次佳 |
| Hint | 用途 | 範例 |
|---|---|---|
| LEADING | 指定連接順序 (優於 ORDERED) | /*+ LEADING(B A C) */ |
| USE_NL / USE_HASH / USE_MERGE | 指定連接方法 | /*+ USE_NL(A) */ |
| INDEX / INDEX_FFS | 指定索引存取 | /*+ INDEX(A IDX_COL12A) */ |
| FULL | 強制全表掃描 | /*+ FULL(B) */ |
| OPT_PARAM | 語句級參數覆蓋 | /*+ OPT_PARAM('_optim_peek_user_binds' 'false') */ |
NUM_ROWS、DISTINCT_KEYS、CLUSTERING_FACTOR、直方圖預估 CardinalityDBMS_STATS.GATHER_TABLE_STATS(..., METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO')DBMS_XPLAN.DISPLAY_CURSOR 對比)深度解讀執行計劃樹結構、掌握驅動表判定縮進法、理解統計資訊對連接順序的決定性影響,是從「看得懂計劃」進化到「精準控制計劃」的關鍵能力躍遷。