實例記憶體雙支柱
| 區域 | 全稱 | 共享性 | 生命週期 | 核心用途 |
| SGA | System Global Area | **所有進程共享** | Instance 啟動~關閉 | 資料快取、SQL 共享、Redo 緩衝、大型操作記憶體 |
| PGA | Program Global Area | **單一進程專用** | Process 建立~終止 | 排序、雜湊、游標狀態、Session 資訊 |
SGA 核心組件詳細解析
1. Database Buffer Cache (資料庫緩衝區快取)
- 參數:
DB_CACHE_SIZE (預設 Pool)、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE、DB_nK_CACHE_SIZE (非標準 Block Size)。
- 三大 Pool 策略:
- DEFAULT:一般物件,LRU 淘汰。
- KEEP:熱點小表 (
ALTER TABLE t STORAGE (BUFFER_POOL KEEP)),**不被淘汰**。
- RECYCLE:大掃描表,**快速淘汰**避免汙染 DEFAULT。
- 關鍵指標:
V$BH 觀察 Buffer Header 狀態 (free/pinned/dirty)。
2. Redo Log Buffer
- 參數:
LOG_BUFFER (靜態參數,通常 1~10 MB,極高寫入負載可調大)。
- LGWR 將其內容寫入 Online Redo Log,**Commit 必須等待 LGWR 寫入完成 (除非
COMMIT_WRITE 異步)**。
3. Shared Pool (共享池) — 最複雜、最關鍵
| 子組件 | 功能 | 關鍵參數/視圖 |
| Library Cache (庫快取) | 已解析 SQL/PLSQL 程式碼、執行計畫 | SHARED_POOL_SIZE, V$LIBRARYCACHE (GETS/PINS/RELOADS/INVALIDATIONS) |
| Shared SQL Area | SQL 文本、解析樹、執行計畫 | Cursor Sharing: CURSOR_SHARING=EXACT/SIMILAR/FORCE |
| Private SQL Area | Bind 變數值、執行時期狀態、工作區 | **Dedicated Server 在 PGA**;**Shared Server 在 SGA** |
| Dictionary Cache (Row Cache) | 資料字典資訊 (用戶、表、權限、同義詞...) | V$ROWCACHE (GETS/GETMISSES) |
| Result Cache (11g+) | 查詢結果集快取 | RESULT_CACHE_MODE, V$RESULT_CACHE_STATISTICS |
Open_Cursors 參數 直接限制 Library Cache 可容納游標數,建議設 1000~3000 視應用而定。
4. Java Pool
- 參數:
JAVA_POOL_SIZE (預設 ~32MB),Java Stored Procedure / EJB / JVM 物件儲存。
5. Large Pool
- 參數:
LARGE_POOL_SIZE (預設 8~16MB)。
- 用途:Shared Server (MTS) UGA、RMAN 備份緩衝、Parallel Query 訊息緩衝、DBWR Slave。
- 若未設定,上述操作會佔用 Shared Pool → **嚴重碎片化風險**。
6. Streams Pool / In-Memory Area (12c+)
STREAMS_POOL_SIZE:GoldenGate/Streams 捕捉/應用。
INMEMORY_SIZE:In-Memory Column Store 專用區 (獨立於 Buffer Cache)。
PGA 核心管理
- 參數:
PGA_AGGREGATE_TARGET (10g+ 自動管理) / PGA_AGGREGATE_LIMIT (12c+ 硬上限防暴增)。
- 工作區:Sort Area, Hash Area, Bitmap Merge, Write Buffer。
- 監控:
V$PGASTAT, V$PROCESS_MEMORY, V$SQL_WORKAREA_ACTIVE。
- **致命風險**:PGA 總和超過實體記憶體 → OS Swap → 效能崩潰。必須設
PGA_AGGREGATE_LIMIT 並監控 V$PGASTAT "over allocation count"。
記憶體規劃黃金法則 (實體 RAM 基礎)
OS 保留 : 10~20% (或固定 8~16 GB)
SGA_TARGET : 50~70% (含 Buffer Cache, Shared Pool, Large Pool, Java Pool, Redo Buffer)
PGA_AGGREGATE_TARGET : 20~30%
------------------------------------------------
總和 < 實體 RAM (預留 OS、監控代理、備份進程等)
自動記憶體管理 (AMM/ASMM) 演進
| 模式 | 參數 | 特點 |
| 手動 (9i-) | 個別參數 | 需人工平衡,彈性差 |
| ASMM (10g+) | SGA_TARGET + PGA_AGGREGATE_TARGET | SGA 內部自動再平衡,PGA 獨立管理 |
| AMM (11g+) | MEMORY_TARGET (含 MEMORY_MAX_TARGET) | SGA+PGA 統一池,OS /dev/shm 支援,**不適用 HugePages/Large Pages** |
**生產建議**:使用 **ASMM + HugePages** (Linux) / **Large Pages** (Solaris/AIX) 鎖定 SGA 實體記憶體,避免 Swap,PGA 獨立設 Target/Limit。
結語
Oracle 記憶體架構以 **SGA 共享、PGA 專用** 為核心,Buffer Cache 多 Pool 隔離、Shared Pool 子組件精細化、PGA 自動管理與硬限制,構成現代記憶體管理體系。**ASMM + HugePages + PGA Limit** 是高載生產環境的鐵三角配置。定期審視 V$SGASTAT, V$PGASTAT, V$LIBRARYCACHE 關鍵比率,保持記憶體健康度。