什麼是執行計畫
資料庫依據 SQL 目的地 (查什麼資料) 自動規劃路徑 (怎麼取資料)。同一條 SQL 可能有數十種計畫,如全表掃描 vs 索引掃描、Nested Loop vs Hash Join,成本差異可達數量級。
優化器模式
| 模式 | 特性 | 適用版本 |
| RULE (RBO) | 固定規則排名,不參考統計資訊,Oracle 10g 除役 | ≤ 9i |
| CHOOSE | 有統計用 CBO,無統計用 RBO (預設 8i/9i) | 8i/9i |
| FIRST_ROWS(n) | 優化前 n 列回應時間,OLTP 常用 | 8i+ |
| ALL_ROWS | 優化整體吞吐量,資料倉庫/報表常用 | 8i+ |
-- Session 級切換
ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS_10;
CBO 成本計算依賴統計資訊
- 表/索引/欄位統計:
DBMS_STATS.GATHER_TABLE_STATS、GATHER_SCHEMA_STATS。
- 直方圖:針對傾斜欄位收集,提升選擇度估算準確度。
- 系統統計 (CPU/IO 速度):
DBMS_STATS.GATHER_SYSTEM_STATS,影響全表掃描 vs 索引權衡。
執行計畫不穩定常見原因
- 統計資訊過期/缺失 → 選擇度估算偏差。
- 綁定變數窺探:首次執行值具代表性,後續值分布迥異導致計畫失效。
- 動態採樣等級不足/過高。
- 參數變更 (
OPTIMIZER_INDEX_COST_ADJ 等)。
固定/穩定執行計畫手段
| 手段 | 適用場景 | 維護成本 |
| Hint (/*+ INDEX(...) */) | 單一 SQL 微調 | 低 (程式碼耦合) |
| Stored Outline (9i~11g) | 固定計畫不改 SQL | 中 (12c 除役) |
| SQL Profile (10g+) | 輔助優化器修正估算 | 低 |
| SQL Plan Baseline (11g+) | 演化管理多計畫、自動驗證 | 低 (推薦) |
| SQL Patch (12c+) | 注入 Hint 不改應用 | 低 |
實務建議
- 建立定期統計收集排程 (含系統統計),啟用自動統計收集作業。
- 關鍵 SQL 建立 SQL Plan Baseline,允許演化但防止劣化。
- 使用
DBMS_XPLAN.DISPLAY_CURSOR 對比實際與預估行數 (E-Rows vs A-Rows) 找出估算偏差根因。
- 避免手動設定過多優化器參數,優先修正統計與 SQL 寫法。