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

Oracle 優化器模式全解析:RBO vs CBO、四大優化模式與 Hint 控制

     編輯:Oracle 資料庫基礎

Oracle Optimizer 核心機制:從規則到成本,從實例到語句級控制

優化器是 Oracle SQL 執行計劃的大腦。本文深度解析 RBO/CBO 兩大優化引擎、四種 OPTIMIZER_MODE、三級參數設置體系與 Hint 干預技巧,助您精準掌控執行計劃。

一、兩大優化引擎

引擎全稱核心邏輯適用版本/場景
RBORule-Based Optimization固定規則集(如:有索引走索引),不考慮數據分佈Oracle 7/8 早期,現已棄用
CBOCost-Based Optimization基於統計信息計算 CPU/IO 成本,選擇最低代價路徑Oracle 8i+ 默認,現代標準

關鍵認知:走索引不一定優,全表掃描不一定劣。小表(如 2 行)全掃 1 次 IO,走索引需 2 次 IO,CBO 會智能選擇 FTS。

二、四大優化模式

模式行為邏輯觸發條件目標
RULE強制 RBO無統計信息或顯式指定兼容舊應用
CHOOSE默認模式:有統計信息用 CBO,無統計信息且有索引用 RBO,極小表用 FTS未設置參數時平衡兼容與性能
FIRST_ROWSCBO + 優化首批行響應時間(FIRST_ROWS_n 更精確)有統計信息OLTP、分頁、交互式查詢
ALL_ROWSCBO + 優化整體吞吐量(最小化總資源消耗)有統計信息數倉、批量報表、ETL

三、三級參數設置體系(優先級遞增)

  1. 實例級:init.ora / spfile 設置 OPTIMIZER_MODE=ALL_ROWS,重啟生效,影響全庫。
  2. 會話級:ALTER SESSION SET OPTIMIZER_MODE=FIRST_ROWS_10;,僅影響當前會話,即時生效。
  3. 語句級:使用 Hint,如 /*+ FIRST_ROWS(10) */、/*+ ALL_ROWS */、/*+ RULE */,精準控制單條 SQL。

四、統計信息:CBO 的生命線

  • 無統計信息 → CBO 退化為類 RBO 行為,甚至產生災難計劃。
  • 過期/不準確統計信息 → 更危險,誤導 CBO 選錯連接順序/訪問路徑。
  • 最佳實踐:啟用 DBMS_STATS 自動收集任務(10g+ 默認開啟),大表分區級收集,批量載入後同步 GATHER_TABLE_STATS。

五、實戰建議

  1. 生產庫統一設置 ALL_ROWS(數倉)或 FIRST_ROWS_10(OLTP)為實例默認。
  2. 關鍵報表 SQL 使用 /*+ ALL_ROWS */ 確保吞吐優先。
  3. 分頁/首頁查詢使用 /*+ FIRST_ROWS(1) */ 或 12c+ FETCH FIRST 語法。
  4. 定期檢查 DBA_TAB_STATISTICS.LAST_ANALYZED 確保統計新鮮度。
  5. 遇到計劃翻車,先 DBMS_STATS.GATHER_TABLE_STATS(..., METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO') 重收統計,再看 Hint/Profile/SPM 固化。

掌握優化器模式與統計信息機制,是從「被動調優」走向「主動治理」執行計劃的關鍵一步。

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