Automatic Shared Memory Management (ASMM)是Oracle 10g引入的里程碑特性:DBA只需設定SGA_TARGET總量,實例自動在四大核心組件間動態再平衡內存,告別9i時代手工試錯調整DB_CACHE_SIZE、SHARED_POOL_SIZE的痛苦。
SGA_TARGET > 0(動態可調,上限受SGA_MAX_SIZE限制)STATISTICS_LEVEL = TYPICAL 或 ALL(關鍵:需統計歷史信息支撐決策)| 類別 | 組件 | 參數 | 說明 |
|---|---|---|---|
| 自動調優 | 默認緩衝區緩存 | DB_CACHE_SIZE | 數據塊緩存,最大消費者 |
| 共享池 | SHARED_POOL_SIZE | SQL/PLSQL解析樹、字典緩存 | |
| 大池 | LARGE_POOL_SIZE | 並行查詢、RMAN、共享服務器UGA | |
| Java池 | JAVA_POOL_SIZE | JVM堆內存 | |
| 手動管理 | 重做日誌緩存 | LOG_BUFFER | 由實例根據日誌組大小固定分配 |
| 流池 | STREAMS_POOL_SIZE | Streams捕獲/應用進程 | |
| 非標準塊大小緩存 | DB_nK_CACHE_SIZE | 2K/4K/8K/16K/32K塊緩存 | |
| KEEP緩存 | DB_KEEP_CACHE_SIZE | 熱點對象鎖定區 | |
| RECYCLE緩存 | DB_RECYCLE_CACHE_SIZE | 大掃描對象快速淘汰區 |
-- 查看各組件當前大小、是否可調、粒度
SELECT * FROM V$SGAINFO;
-- 查看自動調優目標值(雙下劃線參數,持久化於SPFILE)
SHOW PARAMETER __db_cache_size;
SHOW PARAMETER __shared_pool_size;
SHOW PARAMETER __large_pool_size;
SHOW PARAMETER __java_pool_size;
SGA_TARGET - 手動組件總和 = 可自動分配內存,按內部算法分配給四大自動組件。SHUTDOWN NORMAL/IMMEDIATE)時,雙下劃線參數寫入SPFILE,下次啟動直接恢復「成熟狀態」,避免冷啟動抖動。SHARED_POOL_SIZE=200M。實例不會縮小低於此值,但會限制彈性。SGA_MAX_SIZE默認等於原手工SGA總和,升級前務必預留增長空間(如設為物理內存60-70%)。V$SGA_TARGET_ADVICE建議值,再設定SGA_TARGET,觀察V$SGA_RESIZE_OPS調整歷史。MEMORY_TARGET)互斥,不可同時啟用。| 現象 | 排查視圖 | 典型對策 |
|---|---|---|
| 共享池頻繁ORA-04031 | V$SGA_RESIZE_OPS 顯示共享池持續縮小 | 設定 SHARED_POOL_SIZE 最小值;檢查未綁定變量SQL |
| 緩存命中率低 | V$SYSSTAT / V$BUFFER_POOL_STATISTICS | 增大 SGA_TARGET;啟用 KEEP 池鎖定熱點表 |
| 大池不足導致並行查詢降級 | V$PX_PROCESS_SYSSTAT | 設定 LARGE_POOL_SIZE 最小值;評估 PARALLEL_MAX_SERVERS |
| Java池OOM | V$JAVA_POOL_ADVICE | 設定 JAVA_POOL_SIZE;排查Java存儲過程內存洩漏 |
ASMM將SGA管理從「靜態配置」升級為「動態自適應」。DBA角色轉變為:設定總量上限(SGA_MAX_SIZE)、設定目標值(SGA_TARGET)、定義關鍵組件底線、監控V$SGA_RESIZE_OPS調整頻率與幅度。善用V$SGA_TARGET_ADVICE預測不同SGA_TARGET下的性能收益,是容量規劃的利器。