| 模式 | 全稱 | 決策依據 | 適用場景 |
|---|---|---|---|
| RULE | Rule-Based Optimizer (RBO) | 固定規則集 (索引存在即用、全表掃描最後手段) | 舊系統、統計資訊不可靠、規則明確 |
| COST | Cost-Based Optimizer (CBO) | 統計資訊 (表/索引/欄位/系統) 計算執行成本 | 現代系統、統計資訊完整、複雜查詢 |
| CHOOSE | Chooses RBO or CBO | **若表有統計資訊 → CBO,否則 → RBO** | **不推薦** (行為不可預測) |
init.ora / spfile 設定 OPTIMIZER_MODE = RULE | CHOOSE | FIRST_ROWS | ALL_ROWS。ALTER SESSION SET OPTIMIZER_MODE = ...。/*+ RULE */、/*+ FIRST_ROWS(10) */、/*+ ALL_ROWS */。優先序:Statement Hint > Session > Instance。
-- 表級
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP', CASCADE => TRUE);
-- Schema 級
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT', ESTIMATE_PERCENT => 20);
-- 系統統計 (CPU/IO 速度)
EXEC DBMS_STATS.GATHER_SYSTEM_STATS('START'); -- 工作負載期間
EXEC DBMS_STATS.GATHER_SYSTEM_STATS('STOP');
**無統計資訊 CBO 會退化為 RBO 或使用預設值,導致災難性計劃。**
| 路徑 | 說明 | 適用條件 |
|---|---|---|
| Full Table Scan (FTS) | 多區塊讀取 (DB_FILE_MULTIBLOCK_READ_COUNT),順序掃描所有區塊 | 小表、大比例存取、無可用索引、並行查詢 |
| Table Access by ROWID | 單區塊讀取,直接定位物理位置 | 索引範圍掃描後、PK/UK 精確查詢 |
| Index Unique/Range Scan | 走 B*Tree 索引取得 ROWID | WHERE 條件包含索引前導欄位 |
CURSOR_SHARING = FORCE 可將常值強制轉 Bind 變數提高共用率 (可能產生計劃不穩定)。OPTIMIZER_MODE = ALL_ROWS (批次/報表) 或 FIRST_ROWS_n (OLTP)。CBO + 完整統計資訊 + Bind 變數 = 穩定高效執行計劃。RBO 僅作為舊系統相容保留,CHOOSE 已棄用。