SGA 參數配置沒有萬能公式,只有「根據負載、業務、硬件環境動態平衡」的工程實踐。本文總結生產環境驗證的配置模板、32/64 位限制陷阱、ASMM 遷移要點、關鍵組件定量建議,助你避開「盲目加大共享池導致 Latch 爭用」、「32 位系統內存浪費」等經典坑點。
Oracle 10g+ **強烈推薦啟用 ASMM** (SGA_TARGET > 0),由 MMAN 進程根據負載動態在組件間轉移內存。前置條件:STATISTICS_LEVEL = TYPICAL (或 ALL)。
| 類別 | 參數 | 說明 |
|---|---|---|
| 動態可調 (MMAN 自動平衡) | DB_CACHE_SIZE | Default Buffer Pool 最小保障 |
| SHARED_POOL_SIZE | 共享池最小保障 (10g+ 控制總大小) | |
| LARGE_POOL_SIZE | 大池最小保障 | |
| JAVA_POOL_SIZE | Java 池最小保障 | |
| SGA_TARGET | SGA 總上限 (動態調整目標) | |
| 需手動固定 (不參與自動平衡) | LOG_BUFFER | 重做日志緩存,靜態參數,重啟生效 |
| STREAMS_POOL_SIZE | 流池,通常 0 | |
| DB_KEEP_CACHE_SIZE | Keep Pool,業務指定固定 | |
| DB_RECYCLE_CACHE_SIZE | Recycle Pool,業務指定固定 | |
| DB_nK_CACHE_SIZE | 非標準塊大小緩存,表空間綁定 | |
| SGA_MAX_SIZE | 實例啟動時 SGA 硬上限,修改需重啟 |
| 架構 | 進程虛擬地址空間 | Oracle 可用上限 (SGA+PGA) | 備註 |
|---|---|---|---|
| 32 位 OS + 32 位 Oracle | 4 GB | ~1.75 GB (Windows) / ~2.7 GB (Linux /3GB boot) | 已淘汰,僅存量維護 |
| 64 位 OS + 32 位 Oracle | 4 GB (進程) | 同 32 位上限 | 不推薦,測試環境可用 |
| 64 位 OS + 64 位 Oracle | 16 EB (理論) | 受限於物理內存、Swap、shmmax、HugePages | 生產標準配置 |
驗證版本命令:SELECT * FROM V$VERSION; 關注 TNS for 64-bit Linux 或 64-bit Windows。
V$JAVA_POOL_ADVICE。MAX(512KB, 128KB * CPU_COUNT)。| SGA_TARGET 總量 | 建議最小保障 | 核心策略 |
|---|---|---|
| 4-8 GB | 512 MB - 1 GB | 綁定變量優先,命中率 > 99% |
| 8-16 GB | 1 - 2 GB | 監控 V$LIBRARYCACHE RELOADS/INVALIDATIONS |
| 16-32 GB | 2 - 3 GB | 大包拆分、Result Cache、Cursor Sharing=EXACT |
| 32-64 GB | 3 - 4 GB | Reserved Pool 10-15%、_KGHDSIDX_COUNT 增加子堆 |
鐵律:共享池命中率低,先查應用綁定變量使用率,再看 Cursor Sharing,最後才考慮加內存。 盲目加大反增 shared pool / library cache latch 爭用。
UGA/會話 * 最大併發會話 * 1.5 估算,通常需 500MB-2GB+,極易 ORA-04031。公式:SGA_TARGET - (Shared_Pool_Min + Large_Pool_Min + Java_Pool_Min + Log_Buffer + Keep + Recycle + nK_Caches)。
監控 V$DB_CACHE_ADVICE、V$BH 物理讀比率。目標:**邏輯讀滿足率 > 99% (OLTP) / 95% (混合)**。
ALTER TABLE small_hot_table STORAGE (BUFFER_POOL KEEP);DB_BLOCK_SIZE 時配置。CREATE TABLESPACE tbs_16k BLOCKSIZE 16K ...; DB_16K_CACHE_SIZE = 200M;| 物理內存 | SGA_TARGET | PGA_AGGREGATE_TARGET | SHARED_POOL_SIZE (Min) | DB_CACHE_SIZE (Min) | Keep/Recycle |
|---|---|---|---|---|---|
| 16 GB | 8 GB | 4 GB | 512 MB | 4 GB | Keep 256M / Recycle 128M |
| 32 GB | 16 GB | 8 GB | 1 GB | 8 GB | Keep 512M / Recycle 256M |
| 64 GB | 32 GB | 16 GB | 2 GB | 16 GB | Keep 1G / Recycle 512M |
| 128 GB | 64 GB | 32 GB | 3 GB | 32 GB | Keep 2G / Recycle 1G |
| 256 GB | 128 GB | 64 GB | 4 GB | 64 GB | Keep 4G / Recycle 2G |
關鍵:PGA 另行規劃 (排序、哈希、位圖合併)。總內存佔用 < 物理內存 * 80% (預留 OS、監控、備份進程)。
V$SGA_TARGET_ADVICE、各組件實際使用峰值 (查 V$SGA_RESIZE_OPS 歷史或 AWR)。_SIZE 參數 (如 SHARED_POOL_SIZE=1G)。ALTER SYSTEM SET SGA_TARGET=16G SCOPE=BOTH; (需 STATISTICS_LEVEL=TYPICAL)。V$SGA_RESIZE_OPS 調整頻率/幅度,確認無劇烈震盪。SGA_MAX_SIZE > SGA_TARGET 佔用大量物理內存卻不用。SGA_MAX_SIZE 僅是啟動上限,實際分配以 SGA_TARGET 為準。設 SGA_MAX_SIZE = SGA_TARGET 即可。DB_CACHE_SIZE。SHARED_POOL_SIZE。V$SGASTAT 找出大佔用對象 (如未綁定 SQL、大 PLSQL 包、Result Cache)、啟用 _KGHDSIDX_COUNT 多子堆、配置 Reserved Pool。治標不治本必復發。vm.nr_hugepages = (SGA_TARGET / 2MB) + 10%),消除頁表開銷、防止 Swap、提升啟動速度 10 倍+。SGA 配置的本質是「在有限內存中,為 Buffer Cache (讀)、Shared Pool (解析)、Redo Buffer (寫)、Large Pool (並行/備份) 分配黃金份額」。採用 **ASMM + 關鍵組件最小保障 + HugePages** 三板斧,配合 **綁定變量消除硬解析、Keep/Recycle 隔離熱冷、定期 AWR 對比調整最小保障**,即可構建穩定高效的內存體系。記住:參數是靜態的,負載是動態的,監控與迭代才是常態。