首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 執行計畫穩定性深度解析:優化器模式、統計資訊與 Plan 固定

     編輯:Oracle 資料庫相關知識

什麼是執行計畫

資料庫依據 SQL 目的地 (查什麼資料) 自動規劃路徑 (怎麼取資料)。同一條 SQL 可能有數十種計畫,如全表掃描 vs 索引掃描、Nested Loop vs Hash Join,成本差異可達數量級。

優化器模式

模式特性適用版本
RULE (RBO)固定規則排名,不參考統計資訊,Oracle 10g 除役≤ 9i
CHOOSE有統計用 CBO,無統計用 RBO (預設 8i/9i)8i/9i
FIRST_ROWS(n)優化前 n 列回應時間,OLTP 常用8i+
ALL_ROWS優化整體吞吐量,資料倉庫/報表常用8i+
-- Session 級切換
ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS_10;

CBO 成本計算依賴統計資訊

  • 表/索引/欄位統計:DBMS_STATS.GATHER_TABLE_STATS、GATHER_SCHEMA_STATS。
  • 直方圖:針對傾斜欄位收集,提升選擇度估算準確度。
  • 系統統計 (CPU/IO 速度):DBMS_STATS.GATHER_SYSTEM_STATS,影響全表掃描 vs 索引權衡。

執行計畫不穩定常見原因

  1. 統計資訊過期/缺失 → 選擇度估算偏差。
  2. 綁定變數窺探:首次執行值具代表性,後續值分布迥異導致計畫失效。
  3. 動態採樣等級不足/過高。
  4. 參數變更 (OPTIMIZER_INDEX_COST_ADJ 等)。

固定/穩定執行計畫手段

手段適用場景維護成本
Hint (/*+ INDEX(...) */)單一 SQL 微調低 (程式碼耦合)
Stored Outline (9i~11g)固定計畫不改 SQL中 (12c 除役)
SQL Profile (10g+)輔助優化器修正估算低
SQL Plan Baseline (11g+)演化管理多計畫、自動驗證低 (推薦)
SQL Patch (12c+)注入 Hint 不改應用低

實務建議

  • 建立定期統計收集排程 (含系統統計),啟用自動統計收集作業。
  • 關鍵 SQL 建立 SQL Plan Baseline,允許演化但防止劣化。
  • 使用 DBMS_XPLAN.DISPLAY_CURSOR 對比實際與預估行數 (E-Rows vs A-Rows) 找出估算偏差根因。
  • 避免手動設定過多優化器參數,優先修正統計與 SQL 寫法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved