Oracle 提供三種核心優化器模式,決定了 SQL 執行計劃的生成邏輯:
| 模式 | 全稱 | 決策依據 |
|---|---|---|
| RULE | Rule-Based Optimizer (RBO) | 基於固定規則(如索引存在性、語法結構) |
| COST | Cost-Based Optimizer (CBO) | 基於統計信息計算成本(I/O、CPU、網絡) |
| CHOOSE | Choose Mode | 若表有統計信息用 CBO,否則退回 RBO |
可通過 init.ora 中的 OPTIMIZER_MODE 參數設定預設值(可選值:RULE, COST, CHOOSE, ALL_ROWS, FIRST_ROWS),亦可在 Session 層級(ALTER SESSION SET OPTIMIZER_MODE=...)或 SQL 層級(Hint /*+ RULE */, /*+ ALL_ROWS */ 等)覆蓋。
若選擇 CBO(或 CHOOSE 且表已分析),必須定期執行 ANALYZE 或 DBMS_STATS 收集統計信息。統計信息過時或缺失會導致 CBO 產生錯誤執行計劃,引發嚴重性能問題。
Oracle 預設採用 CHOOSE 模式。但這存在風險:
最佳實踐:明確指定優化器模式。生產環境建議直接設定為 ALL_ROWS(吞吐量優先)或 FIRST_ROWS_n(響應時間優先),避免使用 CHOOSE,杜絕非預期的全表掃描。
FIRST_ROWS_10 或 FIRST_ROWS_100。ALL_ROWS。RULE(不推薦新系統使用)。CHOOSE 和單純的 COST(無 ALL_ROWS/FIRST_ROWS 方向)。