System Global Area (SGA) 是 Oracle 實例啟動時分配的共享內存區域,所有背景進程與服務器進程通過它協作。深入理解 SGA 七大組件的功能、控制參數、相互關係與調優策略,是 Oracle 性能優化的基石。本文系統梳理 SGA 內部架構,並給出生產環境參數配置建議。
+--------------------------------------------------------------+
| SGA |
| +----------------+ +----------------+ +----------------+ |
| | Fixed SGA | | Database Buffer| | Redo Log Buffer| |
| | (固定區) | | Cache (緩存) | | (重做日志緩存) | |
| +----------------+ | - Default Pool| +----------------+ |
| | - Keep Pool | +----------------+ |
| +----------------+ | - Recycle Pool| | Java Pool | |
| | Shared Pool | +----------------+ | (Java 池) | |
| | (共享池) | +----------------+ +----------------+ |
| | - Library Cache| | Large Pool | | Streams Pool | |
| | - Data Dict | | (大池) | | (流池) | |
| | - Result Cache| +----------------+ +----------------+ |
| +----------------+ | |
+--------------------------------------------------------------+
SGA_TARGET 額度。DB_CACHE_SIZE 控制。DB_KEEP_CACHE_SIZE 控制,**不被 LRU 淘汰**。DB_RECYCLE_CACHE_SIZE 控制,**快速淘汰**,保護 Default Pool。DB_nK_CACHE_SIZE (n=2,4,8,16,32) 為非標準塊大小表空間分配獨立緩存。DB_CACHE_SIZE、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE、DB_nK_CACHE_SIZE、DB_BLOCK_SIZE (實例級,不可動態修改)。LOG_BUFFER (靜態參數,需重啟生效)。預設 MAX(512KB, 128KB * CPU_COUNT)。典型值 1-10MB,**過大無益處、反增崩潰恢復時間**。JAVA_POOL_SIZE。不使用 Java Stored Procedure 時設 0 或極小 (如 16MB)。PARALLEL_AUTOMATIC_TUNING=TRUE 時自動使用)。BACKUP_DISK_IO_SLAVES 或 _BACKUP_KSFQ_BUFZ 相關)。LARGE_POOL_SIZE。專用服務器模式下建議 16-64MB (僅供並行/RMAN);共享服務器模式需根據併發會話估算 UGA 大小 (每會話 ~100KB-1MB)。RESULT_CACHE_MODE 控制)。SHARED_POOL_SIZE:9i 控制最大子組件,10g+ 控制共享池總大小 (含 Reserved Pool)。SHARED_POOL_RESERVED_SIZE:保留區大小 (默認 5%)。CURSOR_SHARING:EXACT (默認/推薦) / FORCE / SIMILAR (已廢棄)。**綁定變量是根治硬解析的正道,FORCE 只是權宜之計且副作用大。**OPEN_CURSORS:會話最大打開游標數,防洩漏 (典型 300-1000)。library cache, shared pool latch 睡眠比 < 1%。CURSOR_SPACE_FOR_TIME、SESSION_CACHED_CURSORS、大包拆分、Result Cache。盲目增大 SHARED_POOL_SIZE 往往加劇 Latch 爭用、延長掃描鏈、惡化性能。STREAMS_POOL_SIZE。未使用 Streams 技術時設 0。*.memory_target = 0 # 關閉 AMM (實例+PGA 全自動),採用 ASMM
*.sga_target = 6G # SGA 總大小 (動態調整各組件)
*.shared_pool_size = 512M # 共享池最小保障 (動態可增)
*.db_cache_size = 2G # Default Pool 最小保障
*.large_pool_size = 64M # 大池最小保障
*.java_pool_size = 32M # Java 池最小保障
*.log_buffer = 2M # 靜態,需重啟
*.db_keep_cache_size = 256M # Keep Pool 固定
*.db_recycle_cache_size = 128M # Recycle Pool 固定
*.streams_pool_size = 0 # 不用 Streams
*.statistics_level = TYPICAL # 必須 TYPICAL 或 ALL,否則 ASMM 失效
需手動平衡所有組件,總和 < 物理內存 - PGA - OS 預留。32 位系統 SGA+PGA 限制 1.75GB (Windows) / 2.7GB (Linux /3GB 啟動參數)。
| 物理內存 | SGA_TARGET | SHARED_POOL_SIZE (最小) | DB_CACHE_SIZE (最小) | PGA_AGGREGATE_TARGET |
|---|---|---|---|---|
| 16 GB | 8 GB | 512 MB | 4 GB | 4 GB |
| 32 GB | 16 GB | 1 GB | 8 GB | 8 GB |
| 64 GB | 32 GB | 2 GB | 16 GB | 16 GB |
| 128 GB | 64 GB | 3 GB | 32 GB | 32 GB |
註:Keep/Recycle/nK Cache 另加。PGA 另行規劃。HugePages 強烈建議啟用 (vm.nr_hugepages)。
| 視圖 | 核心指標 | 用途 |
|---|---|---|
| V$SGA | 各組件當前大小 | 驗證 ASMM 動態調整結果 |
| V$SGAINFO | 組件大小、可調性 | 快速概覽 |
| V$BH / X$KCBOQH | 緩存命中率、髒塊、LRU 狀態 | Buffer Cache 深度分析 |
| V$LIBRARYCACHE | GETS, PINS, RELOADS, INVALIDATIONS | Library Cache 命中/硬解析 |
| V$ROWCACHE | GETS, GETMISSES, MODIFICATIONS | Data Dictionary Cache |
| V$LATCH / V$LATCH_CHILDREN | GETS, MISSES, SLEEPS, IMMEDIATE_GETS | Latch 爭用熱點 (cache buffers chains, library cache, shared pool) |
| V$SGA_RESIZE_OPS | ASMM 自動調整操作歷史 | 觀察動態調整頻率/幅度 |
| V$SGA_TARGET_ADVICE | 不同 SGA_TARGET 下預估 DB_TIME | 容量規劃、調優決策依據 |
SGA 不是簡單的「內存大餅」,而是精密協作的七大組件集合。調優核心在於:Buffer Cache 承擔讀壓力、Shared Pool 承擔解析壓力、Redo Log Buffer 承擔寫持久化、Large Pool 承擔並行/備份/共享服務壓力。採用 ASMM (SGA_TARGET) 為主、關鍵組件設最小保障為輔,配合 綁定變量消除硬解析、HugePages 消除頁表開銷、Keep/Recycle 池隔離熱冷數據,才能榨乾內存性能。記住:參數調整是手段,消除應用層反模式 (無綁定、大事務、全表掃) 才是本質。