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

Oracle 10g SGA 啟動大小決策邏輯:SGA_TARGET 與 SGA_MAX_SIZE 關系實測

     編輯:Oracle 教學

Oracle 10g SGA 啟動大小決策邏輯:SGA_TARGET 與 SGA_MAX_SIZE 關系實測

Oracle 10g 引入自動共享內存管理 (ASMM),啟動時 SGA 實際大小由 SGA_TARGET 與 SGA_MAX_SIZE 共同決定。本文通過三組對比實驗驗證決策規則。

實驗環境

  • Oracle 10g Enterprise Edition
  • 參數文件 (SPFILE) 動態調整

案例 1:SGA_TARGET = SGA_MAX_SIZE


*.sga_target = 599785472  -- 572 MB
*.sga_max_size = 599785472

啟動結果:


Total System Global Area 599785472 bytes  -- 572 MB
Fixed Size 2022632
Variable Size 171967256
Database Buffers 423624704
Redo Buffers 2170880

結論:兩者相等時,按該值分配。

案例 2:SGA_TARGET < SGA_MAX_SIZE


*.sga_max_size = 800M
*.sga_target = 700M

啟動結果:


Total System Global Area 838860800 bytes  -- 800 MB
SHOW PARAMETER sga_;
-- sga_max_size = 800M
-- sga_target   = 700M

結論:實際分配 = SGA_MAX_SIZE (800M),SGA_TARGET 僅作為內部組件初始目標值,但實例啟動上限由 MAX 決定。

案例 3:SGA_TARGET > SGA_MAX_SIZE


*.sga_max_size = 600M
*.sga_target = 700M

啟動結果:


Total System Global Area 734003200 bytes  -- 700 MB
SHOW PARAMETER sga_;
-- sga_max_size = 700M  (被自動調大)
-- sga_target   = 700M

結論:Oracle 啟動時檢測到 TARGET > MAX,自動將 SGA_MAX_SIZE 提升至 SGA_TARGET 值,最終按 700M 分配。

核心決策規則總結

啟動時 SGA 大小 = MAX(SGA_TARGET, SGA_MAX_SIZE)

  • 若 SGA_TARGET <= SGA_MAX_SIZE → 以 SGA_MAX_SIZE 為準
  • 若 SGA_TARGET > SGA_MAX_SIZE → 隱式調大 SGA_MAX_SIZE = SGA_TARGET,再以此為準

生產環境配置建議

  1. 預留擴容空間:SGA_MAX_SIZE 設為物理內存 60%-70%(留 30% 給 PGA、OS、進程私有內存),SGA_TARGET 設為預期穩態值(如 MAX 的 80-90%)。
  2. 避免 TARGET > MAX:雖然 Oracle 會自動修正,但會寫入 Alert Log 警告,且掩蓋了容量規劃意圖。
  3. 動態調整:運行中可 ALTER SYSTEM SET SGA_TARGET = x SCOPE=BOTH,但不超過 SGA_MAX_SIZE。
  4. 監控視圖:V$SGAINFO、V$SGA_DYNAMIC_COMPONENTS、V$SGA_RESIZE_OPS 觀察組件自動調整歷程。

延伸:11g+ MEMORY_TARGET/MEMORY_MAX_TARGET

11g 引入 AMM (Automatic Memory Management),統一管理 SGA+PGA。同樣遵循 MEMORY_TARGET <= MEMORY_MAX_TARGET 原則,啟動大小取兩者最大值。

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