Oracle 記憶體結構直接決定資料庫效能上限。本文深度剖析 SGA (系統全域區)、PGA (程式全域區)、排序區、大池、Java 池五大元件的功能、關鍵參數、查詢指令與調校原則,助 DMA 從記憶體層面定位瓶頸、規劃容量。
| 元件 | 範圍 | 核心功能 | 關鍵參數 |
|---|---|---|---|
| SGA | 實例級共享 | 資料緩衝、重做日誌緩衝、共用池 (SQL/PLSQL 解析樹、執行計劃、字典快取)、大池、Java 池、Streams 池 | SGA_MAX_SIZE, SGA_TARGET (ASMM) |
| PGA | 程序級私有 | 排序/雜湊/位圖合併工作區、Session 資訊、游標狀態 | PGA_AGGREGATE_TARGET, PGA_AGGREGATE_LIMIT (12c) |
| 排序區 | Session 級 | ORDER BY、GROUP BY、索引建立、合併聯結暫存資料;記憶體不足溢寫臨時表空間 | SORT_AREA_SIZE (手動模式), WORKAREA_SIZE_POLICY=AUTO (自動) |
| 大池 | SGA 子元件 | RMAN 備份/恢復緩衝、平行查詢訊息緩衝、共用伺服器 UGA | LARGE_POOL_SIZE |
| Java 池 | SGA 子元件 | JVM 執行 Java Stored Procedure/Trigger/Method 所需堆疊/堆積 | JAVA_POOL_SIZE |
DB_CACHE_SIZE (手動) 或 SGA_TARGET (自動) 控制。查詢:SHOW PARAMETER DB_CACHE_SIZE。LOG_BUFFER (通常自動計算)。查詢:SHOW PARAMETER LOG_BUFFER。SHARED_POOL_SIZE。查詢:SHOW PARAMETER SHARED_POOL_SIZE。PGA_AGGREGATE_TARGET 設定實例級 PGA 總量目標,Oracle 自動分配給各 Session 的排序/雜湊/位圖工作區。PGA_AGGREGATE_LIMIT 硬性上限,防止失控查詢耗盡記憶體導致 OOM。SHOW PARAMETER PGA_AGGREGATE_TARGET。WORKAREA_SIZE_POLICY=MANUAL):SORT_AREA_SIZE、HASH_AREA_SIZE 固定大小,易造成記憶體浪費或溢寫。AUTO,預設):Oracle 依 PGA_AGGREGATE_TARGET 動態分配,最佳化記憶體利用率。SHOW PARAMETER SORT_AREA_SIZE (僅手動模式生效)。SHOW PARAMETER LARGE_POOL_SIZE。SHOW PARAMETER JAVA_POOL_SIZE。-- SGA 元件大小與動態調整歷程
SELECT COMPONENT, CURRENT_SIZE/1024/1024 MB, LAST_OPER_TYPE, LAST_OPER_TIME
FROM V$SGA_DYNAMIC_COMPONENTS;
-- PGA 使用狀況
SELECT NAME, VALUE/1024/1024 MB FROM V$PGASTAT WHERE NAME IN ('aggregate PGA target parameter','total PGA allocated','maximum PGA allocated');
-- 共用池碎片與重載
SELECT * FROM V$LIBRARYCACHE WHERE RELOADS > 0;
-- 排序區溢寫臨時表空間統計
SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME IN ('sorts (memory)','sorts (disk)');
SGA_TARGET) + AMM (MEMORY_TARGET 11g+) 讓 Oracle 自動平衡 SGA/PGA。V$SGA_RESIZE_OPS 確認動態調整頻率不過高 (每小時 < 5 次)。AWR 報表對比 Buffer Cache Hit Ratio、Library Cache Hit Ratio、PGA Cache Hit % 趨勢。精準掌握記憶體架構與參數,是從「猜測調校」走向「資料驅動調校」的關鍵。