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

Oracle 效能分析系列 11:系統統計資訊收集與 CPU Cost Model 完整指南

     編輯:Oracle 教學

系統統計資訊:讓優化器從「盲目估算」走向「真實成本計算」

背景:從 I/O Cost 到 CPU Cost Model

  • 早期優化器採 **I/O Cost Model**,假設單區塊讀與多區塊讀成本相同,嚴重偏離實體。8i 引入 OPTIMIZER_INDEX_CACHING/OPTIMIZER_INDEX_COST_ADJ 修補,但預設值僅適合報表/數倉。
  • 9i 引入 **CPU Cost Model**,綜合 CPU 週期、單/多區塊讀取時間、多區塊讀取數 (MBRC) 計算真實成本,**前提是必須收集系統統計資訊**。

系統統計資訊儲存結構 (AUX_STATS$)

SELECT * FROM aux_stats$;
SNAME           PNAME           PVAL1                    PVAL2
SYSSTATS_INFO   STATUS          COMPLETED
SYSSTATS_INFO   DSTART          08-30-2005 15:04
SYSSTATS_INFO   DSTOP           08-30-2005 15:04
SYSSTATS_MAIN   CPUSPEEDNW      484.97                   (Noworkload)
SYSSTATS_MAIN   IOSEEKTIM       10                       (ms, default)
SYSSTATS_MAIN   IOTFRSPEED      4096                     (bytes/ms, default)
SYSSTATS_MAIN   SREADTIM        5.2                      (Workload)
SYSSTATS_MAIN   MREADTIM        18.7
SYSSTATS_MAIN   CPUSPEED        1250
SYSSTATS_MAIN   MBRC            64
SYSSTATS_MAIN   MAXTHR          524288000
SYSSTATS_MAIN   SLAVETHR        52428800

兩類統計資訊對比

類別指標取得方式適用場景
Noworkload
(非負載)
CPUSPEEDNW空閒系統基準測試10g+ 預設自動收集,無代表性負載時
IOSEEKTIM預設 10ms (可手動設定)
IOTFRSPEED預設 4096 bytes/ms (可手動設定)
Workload
(負載)
SREADTIM真實負載下單區塊平均讀取時間生產環境代表性負載窗口,精度高
MREADTIM真實負載下多區塊平均讀取時間
CPUSPEED真實負載下 CPU 處理速度
MBRC實際多區塊讀取平均區塊數
MAXTHR系統最大 I/O 吞吐量 (bytes/sec)
SLAVETHR並行從程序平均 I/O 吞吐量

收集方法:DBMS_STATS.GATHER_SYSTEM_STATS

1. 非負載統計 (快速、離線)

BEGIN DBMS_STATS.GATHER_SYSTEM_STATS('NOWORKLOAD'); END;
-- 需在系統閒置時執行,耗時極短,有時需執行多次才生效

2. 負載統計 (精準、線上)

-- 步驟 1: 開始快照
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS('START'); END;

-- 步驟 2: 等待代表性負載 (建議 ≥ 30 分鐘,涵蓋尖峰/離峰)

-- 步驟 3: 結束快照並計算
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS('STOP'); END;

-- 或單指令指定間隔 (非阻塞,內部建立 Job)
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS('INTERVAL', 30); END; -- 30 分鐘

進階:手工整合多日統計並套用

-- 連續數天收集 Workload 統計,取平均/最大值
BEGIN
  DBMS_STATS.DELETE_SYSTEM_STATS();
  DBMS_STATS.SET_SYSTEM_STATS('CPUSPEED',   772);
  DBMS_STATS.SET_SYSTEM_STATS('SREADTIM',   5.5);
  DBMS_STATS.SET_SYSTEM_STATS('MREADTIM',   19.4);
  DBMS_STATS.SET_SYSTEM_STATS('MBRC',       53);
  DBMS_STATS.SET_SYSTEM_STATS('MAXTHR',     1136136192);
  DBMS_STATS.SET_SYSTEM_STATS('SLAVETHR',   16870400);
END;

關鍵建議

  • 10g+ 預設啟用 CPU Cost Model,**務必收集 Workload 統計** 以發揮效用。
  • 非負載統計僅作為備援,無法反映真實 I/O 子系統特性。
  • 收集窗口必須涵蓋「典型業務負載」,避免備份、批次等非典型負載污染統計。
  • 統計失效會顯示 STATUS = BADSTATS,優化器將忽略並退回預設值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved