Oracle 10g 引入自動共享內存管理 (ASMM),啟動時 SGA 實際大小由 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
結論:兩者相等時,按該值分配。
*.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 決定。
*.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,再以此為準
SGA_MAX_SIZE 設為物理內存 60%-70%(留 30% 給 PGA、OS、進程私有內存),SGA_TARGET 設為預期穩態值(如 MAX 的 80-90%)。ALTER SYSTEM SET SGA_TARGET = x SCOPE=BOTH,但不超過 SGA_MAX_SIZE。V$SGAINFO、V$SGA_DYNAMIC_COMPONENTS、V$SGA_RESIZE_OPS 觀察組件自動調整歷程。11g 引入 AMM (Automatic Memory Management),統一管理 SGA+PGA。同樣遵循 MEMORY_TARGET <= MEMORY_MAX_TARGET 原則,啟動大小取兩者最大值。