優化器是 Oracle SQL 執行計劃的大腦。本文深度解析 RBO/CBO 兩大優化引擎、四種 OPTIMIZER_MODE、三級參數設置體系與 Hint 干預技巧,助您精準掌控執行計劃。
| 引擎 | 全稱 | 核心邏輯 | 適用版本/場景 |
|---|---|---|---|
| RBO | Rule-Based Optimization | 固定規則集(如:有索引走索引),不考慮數據分佈 | Oracle 7/8 早期,現已棄用 |
| CBO | Cost-Based Optimization | 基於統計信息計算 CPU/IO 成本,選擇最低代價路徑 | Oracle 8i+ 默認,現代標準 |
關鍵認知:走索引不一定優,全表掃描不一定劣。小表(如 2 行)全掃 1 次 IO,走索引需 2 次 IO,CBO 會智能選擇 FTS。
| 模式 | 行為邏輯 | 觸發條件 | 目標 |
|---|---|---|---|
| RULE | 強制 RBO | 無統計信息或顯式指定 | 兼容舊應用 |
| CHOOSE | 默認模式:有統計信息用 CBO,無統計信息且有索引用 RBO,極小表用 FTS | 未設置參數時 | 平衡兼容與性能 |
| FIRST_ROWS | CBO + 優化首批行響應時間(FIRST_ROWS_n 更精確) | 有統計信息 | OLTP、分頁、交互式查詢 |
| ALL_ROWS | CBO + 優化整體吞吐量(最小化總資源消耗) | 有統計信息 | 數倉、批量報表、ETL |
init.ora / spfile 設置 OPTIMIZER_MODE=ALL_ROWS,重啟生效,影響全庫。ALTER SESSION SET OPTIMIZER_MODE=FIRST_ROWS_10;,僅影響當前會話,即時生效。/*+ FIRST_ROWS(10) */、/*+ ALL_ROWS */、/*+ RULE */,精準控制單條 SQL。DBMS_STATS 自動收集任務(10g+ 默認開啟),大表分區級收集,批量載入後同步 GATHER_TABLE_STATS。FIRST_ROWS_10(OLTP)為實例默認。/*+ ALL_ROWS */ 確保吞吐優先。/*+ FIRST_ROWS(1) */ 或 12c+ FETCH FIRST 語法。DBA_TAB_STATISTICS.LAST_ANALYZED 確保統計新鮮度。DBMS_STATS.GATHER_TABLE_STATS(..., METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO') 重收統計,再看 Hint/Profile/SPM 固化。掌握優化器模式與統計信息機制,是從「被動調優」走向「主動治理」執行計劃的關鍵一步。