Oracle 提供三種優化器模式,由初始化參數 `OPTIMIZER_MODE` 或 Session/Statement 層級覆蓋:
| 模式 | 特性 | 適用場景 |
|---|---|---|
| RULE (RBO) | 基於啟發式規則,不依賴統計資訊,固定存取路徑優先序 (索引 > 全表掃描) | 舊版應用、統計資訊缺失、極簡單查詢 |
| COST (CBO) | 基於成本模型,需準確統計資訊 (`ANALYZE`/`DBMS_STATS`),評估 CPU/I/O 成本選擇最佳路徑 | 現代應用標準,複雜查詢、大表連接、分區表 |
| CHOOSE | 若表有統計資訊用 CBO,否則用 RBO (預設值,不建議使用) | 避免使用,易導致計畫不穩定 |
最佳實踐:明確設定 `OPTIMIZER_MODE=ALL_ROWS` (全庫最佳吞吐) 或 `FIRST_ROWS_n` (優先回應前 N 列),並定期執行 `DBMS_STATS.GATHER_SCHEMA_STATS` 維護統計資訊。
關鍵指標:`Clustering Factor` (CF) 反映索引順序與表物理順序一致度;CF 接近塊數 = 好,接近列數 = 差。`Filter Factor` (FF) 為預估回傳列數佔總列數比例。CBO 成本估算約 `FF * (CF + Index Blocks)`。
首次解析後,SQL 文本、解析樹、執行計畫存放於 SGA Shared Pool (Library Cache),供所有 Session 重用,避免重複硬解析。
掌握優化器模式選擇、理解 FTS 與 Index Access 成本模型、遵循共享游標嚴格匹配規則,是 SQL 調優的基石。下一章將深入探討連接順序、WHERE 子句排序、避免 `SELECT *`、減少資料庫往返等實戰技巧。