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

Oracle SQL 效能優化系列 (一):優化器模式選擇、存取路徑 (全表掃描 vs ROWID) 與統計資訊重要性

     編輯:PHP 相關知識

Oracle 三種優化器模式

模式參數值特性適用場景
RULE (RBO)OPTIMIZER_MODE=RULE基於固定規則 (啟發式),不參考統計資訊舊系統相容、統計資訊不可靠時
COST (CBO)OPTIMIZER_MODE=COST / ALL_ROWS / FIRST_ROWS基於成本模型,參考物件統計資訊現代系統標準、需定期收集統計
CHOOSEOPTIMIZER_MODE=CHOOSE (預設)有統計用 CBO,無統計用 RBO不推薦,行為不可預測

設定優化器模式

-- 實例層級 (init.ora / spfile)
OPTIMIZER_MODE = ALL_ROWS  -- 全表最佳吞吐量 (批次/報表)
OPTIMIZER_MODE = FIRST_ROWS_10  -- 前 10 行最快回應 (OLTP/Web)

-- Session 層級
ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS;

-- SQL 層級 Hint
SELECT /*+ FIRST_ROWS(10) */ * FROM emp WHERE deptno = 10;
SELECT /*+ ALL_ROWS */ * FROM large_table;

CBO 前提:統計資訊必須準確

-- 收集表/索引/欄位統計 (10g+ 推薦 DBMS_STATS)
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP', CASCADE=>TRUE, METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');

-- 10g+ 自動統計收集作業 (預設啟用,維護窗口執行)
-- 檢查:SELECT * FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME = 'auto optimizer stats collection';

關鍵統計項目: 表區塊數、列數、平均列長、欄位 NDV (不重複值數)、直方圖、索引層級/葉區塊/聚簇因子。

表存取路徑:全表掃描 vs ROWID 存取

路徑機制觸發條件效能特徵
全表掃描 (FTS)多區塊讀取 (db_file_multiblock_read_count),掃描 High Water Mark 以下所有區塊無索引、索引選擇性低 (>5-10%)、小表、並行查詢序列 I/O 效率高,但讀取大量非必要區塊
索引掃描 → ROWID 存取1. 索引範圍掃描取得 ROWID
2. 由 ROWID 定位表區塊 (單區塊讀取)
高選擇性索引、唯一鍵查詢、範圍查詢隨機 I/O 多,適用少量資料回傳

ROWID 結構與索引關係

  • ROWID = 物件編號 + 相對檔案號 + 區塊號 + 列號 (10g+ 10 位元組擴展格式)。
  • 索引 (B-tree) 儲存 (索引鍵值, ROWID) 配對,提供「值 → 物理位置」映射。
  • 非分區表索引為全局索引;分區表可建局部索引 (每分區獨立) 或全局索引。

避免不必要全表掃描的實務原則

  1. 拒絕 CHOOSE 模式: 明確設定 ALL_ROWS 或 FIRST_ROWS_n。
  2. 定期收集統計: 自動作業 + 手動針對大表/易變表補充直方圖。
  3. 建立適當索引: WHERE/JOIN/ORDER BY 欄位、高選擇性欄位、外鍵欄位。
  4. 使用 Hint 微調: /*+ INDEX(t idx_name) */、/*+ FULL(t) */ (測試用)。
  5. 監控執行計畫: EXPLAIN PLAN、DBMS_XPLAN.DISPLAY_CURSOR、AWR/ASH 報表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved