首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

深入解析 Oracle PGA 與 UGA 的核心差異與記憶體架構

     編輯:Oracle 資料庫基礎

前言:進程與會話的記憶體視角

初學 Oracle 時,常對 PGA(Program Global Area)與 UGA(User Global Area)的區別感到困惑。其實,這兩者的關係正如「進程」與「會話」的關係一般:雖然通常是一對一,但在共享服務器(MTS)架構下,會話數遠超進程數,二者的記憶體分配邏輯便截然不同。本文將從記憶體結構、組成區域、儲存位置等維度,深度剖析 PGA、UGA 及 CGA 的核心差異。

一、 核心記憶體區域概覽

除系統全局區(SGA)外,Oracle 進程還使用三大全局記憶體區域:

  • PGA(Process Global Area):進程專用記憶體,非共享。
  • UGA(User Global Area):會話專用記憶體,存儲會話狀態。
  • CGA(Call Global Area):調用專用記憶體,生命週期極短,隨調用結束而釋放。

二、 PGA:進程的私有領地

1. 定義與特性

PGA 位於進程私有記憶體中,不被其他進程共享。每個服務器進程擁有獨立的 PGA,包含該進程專屬的全局變量、數據結構及操作系統資源信息。因無併發訪問風險,PGA 結構無需 Latch 保護。

2. 兩大核心組件

  • Fixed PGA:類似 Fixed SGA,包含原子變量、小型數據結構及指向 Variable PGA 的指針。
  • Variable PGA (PGA Heap):動態堆內存,可通過 X$KSMPP 固定表查看 Chunk 詳情。其大小受 DB_FILES、LOG_FILES、CONTROL_FILES 等參數影響。

3. 關鍵作用

PGA 記錄進程使用的 OS 資源與狀態信息。進程終止時,私有 PGA 可隨之自動清理釋放,避免資源洩漏。

三、 UGA:會話的狀態倉庫

1. 存儲內容

UGA 承載會話級上下文,包括:

  • 打開游標的狀態與運行區域
  • PL/SQL 包狀態、變量值
  • Java 會話狀態
  • 啟用的 Roles、Trace 事件、NLS 參數
  • Database Link 連接信息

2. 結構劃分

  • Fixed UGA:約 70 個原子變量、小結構及指向 Variable UGA 的指針。
  • Variable UGA (UGA Heap):可通過 X$KSMUP 查看,受 OPEN_CURSORS、OPEN_LINKS、MAX_ENABLE_ROLES 參數影響。

3. 儲存位置:專用 vs 共享模式的分水嶺

連接模式Fixed UGA 位置UGA Heap 位置
專用服務器 (Dedicated)PGA 中的一個 ChunkPGA 的子堆
共享服務器 (MTS)Shared Pool 中的一個 ChunkShared Pool 的子堆

這也是 MTS 架構下「會話多於進程」的記憶體基石:UGA 必須放入 SGA 以便多進程共享訪問。

四、 CGA:調用級的臨時緩衝區

1. 生命週期與用途

CGA 僅在 SQL 解析、執行、Fetch 等「調用」期間存在。遞歸調用(如解析時查數據字典、PL/SQL 執行 SQL、觸發器執行)均需獨立 CGA。

2. 與 PGA/UGA 的關係

  • CGA 始終是 PGA 的子堆,無論 UGA 在 PGA 還是 SGA。
  • 推論:一次調用期間,會話必須綁定一個進程。MTS 開發中若調用頻繁,需增加 processes 參數。

3. 數據結構分工

  • UGA:存放跨調用持久化的結構(SQL Area、PL/SQL Area、Sort Area)。
  • CGA:存放調用結束即可釋放的臨時結構(遞歸調用信息、直接 I/O Buffer)。

4. Java Call Memory 特例

Java 調用內存同屬 CGA,但採用分代垃圾回收(Stack/New/Old Space),是 Oracle 內存管理中唯一的 GC 機制,其他區域均為釋放 Dead Chunk。

五、 總結對比表

維度PGAUGACGA
作用域進程會話單次調用
共享性私有視模式而定 (Dedicated 私有 / MTS 共享)私有 (屬於進程)
生命週期進程存活期會話存活期調用期間
核心內容OS 資源、進程狀態、排序/雜湊區游標、包變量、會話上下文遞歸調用、臨時 Buffer
保護機制無需 LatchMTS 下需共享池鎖保護無需 Latch

理解 PGA/UGA/CGA 的分工,是掌握 Oracle 記憶體架構、排查 MTS 性能問題、優化 PGA 聚合目標(PGA_AGGREGATE_TARGET)的關鍵基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved