SGA (System Global Area) 是 Oracle 執行個體共享記憶體核心,由七大元件組成。本文深度剖析各元件功能、關鍵參數控制關係、自動/手動管理模式切換,並給出生產環境調校建議。
| 元件 | 功能描述 | 典型佔比 | 關鍵參數 |
| Fixed SGA | 內部指標陣列、指向其他元件的指標,大小固定約 KB 級 | < 1% | 不可調 |
| Database Buffer Cache (DB Cache) | 資料區塊緩存,支援 Default/Keep/Recycle 三池 + 多區塊大小 | 40~60% | DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE, DB_nK_CACHE_SIZE |
| Redo Log Buffer | Redo 記錄暫存,觸發寫入:每 3 秒 / 1MB 或 1/3 滿 / COMMIT / Checkpoint 前 | 1~5 MB | LOG_BUFFER |
| Shared Pool | Library Cache (SQL/PLSQL 計畫)、Dictionary Cache、Result Cache、Control Structures | 15~25% | SHARED_POOL_SIZE, RESULT_CACHE_MAX_SIZE |
| Large Pool | 大記憶體分配:RMAN 備份、共用伺服器 UGA、平行執行訊息緩衝 | 10~100 MB | LARGE_POOL_SIZE |
| Java Pool | Java 類別/物件/會話狀態 | 20~50 MB | JAVA_POOL_SIZE |
| Streams Pool | Streams/GoldenGate 捕獲/應用、XStream、資料庫鏈結 | 視啟用功能 | STREAMS_POOL_SIZE |
二、 記憶體管理模式演進
| 版本 | 模式 | 控制參數 | 特點 |
| 9i/10g | 手動 | 各 *_SIZE 參數 | DBA 精確控制,維護成本高 |
| 10g+ | 自動共用記憶體 (ASMM) | SGA_TARGET, SGA_MAX_SIZE | Oracle 自動在元件間平衡,建議生產啟用 |
| 11g+ | 自動記憶體管理 (AMM) | MEMORY_TARGET, MEMORY_MAX_TARGET | SGA+PGA 統一管理,/dev/shm 需足夠 |
關鍵參數關係
SGA_MAX_SIZE:硬上限,修改需重啟
SGA_TARGET:ASMM 目標值,動態可調,≤ SGA_MAX_SIZE
- 若
SGA_TARGET = 0 → 手動模式,各 *_SIZE 生效
- 若
SGA_TARGET > 0 → 自動模式,非零 *_SIZE 視為**最小值保證**
三、 Buffer Cache 三池架構與多區塊大小
1. 三池分工
- Default Pool:所有物件預設緩存區
- Keep Pool:小型高頻存取表(代碼表、參考表),
ALTER TABLE t STORAGE (BUFFER_POOL KEEP);
- Recycle Pool:大型低頻掃描表(歷史日誌、暫存表),避免汙染 Default Pool
三池記憶體**互不共享**,需分別設定大小。
2. 多區塊大小 (9i+)
-- 建立 16K 區塊表空間
CREATE TABLESPACE ts_16k DATAFILE '...' BLOCKSIZE 16K;
-- 必須同時建立對應快取
ALTER SYSTEM SET DB_16K_CACHE_SIZE = 100M;
支援 2K/4K/8K/16K/32K,標準區塊大小由 DB_BLOCK_SIZE 決定。
四、 Redo Log Buffer 與寫入觸發機制
- LGWR 觸發寫入條件(任一滿足):
① 每 3 秒
② 緩衝區達 1MB 或 1/3 滿
③ 使用者 COMMIT
④ DBWR 寫入資料檔前 (Checkpoint)
LOG_BUFFER 過小 → log buffer space 等待;過大浪費記憶體,通常 1~5 MB 足夠
五、 Shared Pool 內部結構與常見問題
| 子元件 | 內容 | 常見等待事件 |
| Library Cache | SQL/PLSQL 解析樹、執行計畫 | library cache lock/pin, latch: library cache |
| Dictionary Cache | 資料字典快取 (用戶、表、欄位、權限) | row cache lock |
| Result Cache | 查詢結果/PLSQL 函數結果快取 | result cache: RC latch |
| Control Structures | Enqueue、鎖、會話資訊等控制結構 | enq: TX - row lock contention |
六、 生產環境調校檢查清單
- 啟用 ASMM (
SGA_TARGET) 或 AMM (MEMORY_TARGET),預留 SGA_MAX_SIZE 彈性空間
- 監控
V$SGA_TARGET_ADVICE、V$MEMORY_TARGET_ADVICE 獲取 Oracle 建議值
- Buffer Cache 命中率:
SELECT 1 - (physical_reads / (db_block_gets + consistent_gets)) FROM v$sysstat; 目標 > 95%
- Shared Pool 碎片化:
SELECT * FROM v$sgastat WHERE pool='shared pool' AND name='free memory'; 免費記憶體 < 5MB 需關注
- 大表全掃描 → 考慮
PARALLEL + LARGE_POOL 或 DB_16K_CACHE_SIZE
- RMAN 備份慢 → 增加
LARGE_POOL_SIZE (至少 50MB 起)
- Java/Streams 未啟用 → 將
JAVA_POOL_SIZE/STREAMS_POOL_SIZE 設 0 釋放記憶體
七、 12c/19c/21c 新特性
- In-Memory Column Store (IM column store):獨立於 Buffer Cache,
INMEMORY_SIZE 控制,行/混合/柱狀儲存
- Memoptimized Rowstore (19c):高頻單鍵查詢專用快取,
MEMOPTIMIZE_POOL_SIZE
- 自動索引 (19c/21c):背景自動建立/刪除索引,間接影響 Buffer Cache/Shared Pool 壓力
SGA 調校核心在於「啟用自動管理建立基線 → 依 AWR/ASH 微調最小值保證 → 監控關鍵等待事件迭代」,而非一次設定終身不動。
- 上一篇文章: Oracle 表連接四大類型實戰:等值、外部、不等值與自連接完整語法
- 下一篇文章: Oracle Linux 靜默安裝自動化腳本:核心參數、用戶建立、環境變數一鍵配置
Copyright ©
程式碼之家 All Rights Reserved