PGA 是伺服器進程專用的私有記憶體區域,直接決定排序效能、並發承載與記憶體壓力。本文深入剖析 PGA 四大子區 (排序區、會話區、堆疊區、游標區) 運作原理、參數調校與監控診斷實戰。
| 維度 | SGA (System Global Area) | PGA (Program Global Area) |
|---|---|---|
| 共享性 | **所有進程共享** | **專屬單一伺服器進程**,不共享 |
| 生命週期 | 實例啟動建立,關閉釋放 | 進程啟動建立,進程結束釋放 |
| 主要用途 | 資料緩衝、共用池、重做日誌緩衝、大池等 | 排序、雜湊連線、位圖合併、會話資訊、游標狀態、PL/SQL 執行上下文 |
| 大小控制 | SGA_TARGET, SGA_MAX_SIZE | PGA_AGGREGATE_TARGET (10g+ 自動管理), PGA_AGGREGATE_LIMIT (12c+ 硬上限) |
| 典型佔比 | 系統記憶體 40-60% | 系統記憶體 20-40% (視排序/雜湊負載) |
SORT_AREA_SIZE (9i 手動模式):每個排序操作最大記憶體。PGA_AGGREGATE_TARGET (10g+ 自動模式):總 PGA 預算,Oracle 自動分配 _SMM_MAX_SIZE (單次排序上限,通常為 PGA 目標的 5-10%)。WORKAREA_SIZE_POLICY = AUTO (預設) 啟用自動管理。-- 查詢磁碟排序次數 (應趨近 0)
SELECT name, value FROM v$sysstat WHERE name LIKE '%sort%';
-- 當前工作區使用情況
SELECT * FROM v$sql_workarea_active;
SELECT * FROM emp WHERE deptno = :b1 中的 :b1 值儲存於此。PGA_AGGREGATE_LIMIT 限制)。OPEN CURSOR 分配結構、解析 (若未共用)、鎖定庫存單元;CLOSE 釋放。頻繁開關 = CPU/閂爭用。OPEN_CURSORS (預設 300) 限制 Session 同時開啟游標數。超過拋 ORA-01000。v$open_cursor 找出洩漏會話。ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 2G SCOPE=BOTH; (視實體記憶體、SGA、OS 需求留 20-30% 給 PGA)。ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 4G SCOPE=BOTH; 防止失控進程耗盡記憶體導致 OOM Killer 殺掉 Oracle 進程。SELECT * FROM v$pga_target_advice; —— 顯示不同目標值下的預估磁碟排序量與額外記憶體需求。ALTER SESSION SET SORT_AREA_SIZE = 100M; (需 WORKAREA_SIZE_POLICY=MANUAL 臨時切換)。| 現象 | 可能原因 | 排查與解決 |
|---|---|---|
| 查詢緩慢、TEMP 表空間暴增 | 排序區不足觸發磁碟排序 | 檢視 v$sql_workarea_active 確認 ONEPASS/MULTIPASS;增加 PGA_TARGET 或優化 SQL 減少排序集 |
| ORA-04030: out of process memory | PGA 總用量超過 OS 限制或 PGA_AGGREGATE_LIMIT | 檢查 v$process_memory 找出佔用大戶;優化 PL/SQL 集合大小、游標洩漏、大量並行排序 |
| ORA-01000: maximum open cursors exceeded | 應用未關閉 ResultSet/Statement | 代碼審計確保 try-with-resources / finally 關閉;適度調大 OPEN_CURSORS (如 500-1000) |
| 權限變更不生效 | 會話區快取舊權限 | 重新登入或 DBMS_SESSION.RESET_PACKAGE;DDL 隱含提交會刷新 |
PGA_AGGREGATE_TARGET + WORKAREA_SIZE_POLICY=AUTO。PGA_AGGREGATE_LIMIT 防禦記憶體耗盡。