首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 優化器三大模式深度解析:RULE、COST、CHOOSE 選擇指南與避坑指南

     編輯:Oracle 資料庫基礎

Oracle 優化器模式決定 SQL 執行計畫生成邏輯。OPTIMIZER_MODE 可設為 RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。本文解析三大經典模式差異、CHOOSE 陷阱、現代最佳實務。

三大經典模式對比

模式全名決策依據適用版本現狀
RULERule-Based Optimizer (RBO)固定規則排序(索引類型、UNIQUE、單表存取路徑優先級)Oracle 7-10g10g 棄用,11g 移除
COSTCost-Based Optimizer (CBO)統計資訊(表/索引/欄位/系統)、CPU/I/O 成本模型Oracle 7+唯一現代優化器
CHOOSEChoose Optimizer若表有統計資訊 → CBO;無統計 → RBOOracle 8-10g10g 棄用,11g 移除

CHOOSE 陷阱:為何預設模式會導致全表掃描

早期版本預設 OPTIMIZER_MODE=CHOOSE。若開發/測試環境未收集統計資訊,優化器退回 RBO,依規則選擇索引;上線後統計資訊齊全,切換為 CBO,可能因統計偏差選擇全表掃描,導致效能劇烈波動。

現代最佳實務(10g/11g/12c/19c/21c/23c)

  1. 永遠使用 CBO:ALTER SYSTEM SET OPTIMIZER_MODE=ALL_ROWS SCOPE=BOTH;(全表最佳吞吐)或 FIRST_ROWS_n(前 n 列最快回應)。
  2. 收集完整統計資訊:
    EXEC DBMS_STATS.GATHER_DATABASE_STATS(options=>'GATHER AUTO');
    -- 或針對表
    EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT', tabname=>'EMP', cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE AUTO');
  3. 啟用自動統計收集:10g+ 預設開啟 AUTO_STATS_TARGET,維護窗口每日執行,勿手動關閉。
  4. SQL 層級覆蓋:/*+ ALL_ROWS */、/*+ FIRST_ROWS(10) */、/*+ RULE */(僅相容舊碼,勿新用)。
  5. 會話層級覆蓋:ALTER SESSION SET OPTIMIZER_MODE=FIRST_ROWS_10;

CBO 核心輸入:統計資訊完整性檢查清單

  • 表級:NUM_ROWS、BLOCKS、AVG_ROW_LEN、SAMPLE_SIZE、LAST_ANALYZED
  • 索引級:BLEVEL、LEAF_BLOCKS、DISTINCT_KEYS、CLUSTERING_FACTOR
  • 欄位級:NUM_DISTINCT、LOW_VALUE/HIGH_VALUE、DENSITY、HISTOGRAM(頻率/高度平衡)
  • 系統級:CPUSPEEDNW、IOSEEKTIM、IOTFRSPEED、MAXTHR、SLAVETHR(DBMS_STATS.GATHER_SYSTEM_STATS)

避坑指南:常見誤區

誤區後果正確做法
以為 RBO 更穩定忽略資料分佈、硬體差異,新版不支援全面拥抱 CBO,投資統計資訊品質
只收集表統計,忽略欄位直方圖傾斜欄位選擇性預估嚴重偏差METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO' 或 SKEWONLY
統計資訊過期不更新CBO 基於舊數據產生劣化計畫啟用自動任務、大表增量統計 INCREMENTAL=TRUE
生產環境直接用 CHOOSE統計收集前後計畫劇變,極難排查明確設定 ALL_ROWS/FIRST_ROWS

驗證當前優化器模式

SHOW PARAMETER OPTIMIZER_MODE;
SELECT name, value FROM v$parameter WHERE name LIKE 'optimizer_%';

拋棄 RBO/CHOOSE 歷史包袱,建立「CBO + 完整統計 + 自動收集 + 系統統計」四位一體優化體系,才是 Oracle 效能穩定的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved