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

Oracle 三大核心記憶體結構深度解析:SGA、PGA 與 UGA

     編輯:Oracle 資料庫基礎

前言

Oracle 記憶體架構是效能調校的基石。理解 SGA (System Global Area)、PGA (Program Global Area) 與 UGA (User Global Area) 的職責、分配機制與交互關係,是 DBA 與開發人員的必修課。

一、系統全域區 SGA — 共享記憶體核心

定義與特性

  • 實例啟動時分配,所有前景/背景進程共享
  • 大型共享記憶體段(UNIX 為 Shared Memory Segment,Windows 為虛擬記憶體映射)
  • 幾乎所有 Oracle 進程都需存取 SGA 中的某些區域

核心組件

組件功能關鍵參數
Database Buffer Cache緩存資料塊(資料表、索引)DB_CACHE_SIZE, DB_K_CACHE_SIZE
Shared PoolLibrary Cache (SQL/PLAN)、Data Dictionary CacheSHARED_POOL_SIZE
Redo Log Buffer緩存 Redo Entry,定期刷入線上重做日誌LOG_BUFFER
Large Pool備份/還原、共用伺服器 UGA、平行查詢訊息緩衝LARGE_POOL_SIZE
Java PoolJava 程式碼、Session 狀態JAVA_POOL_SIZE
Streams PoolStreams 複寫、Advanced QueuingSTREAMS_POOL_SIZE
In-Memory AreaColumnar 格式資料(12c+)INMEMORY_SIZE

動態管理 (9i+)

-- 查看 SGA 總覽
SHOW SGA;

-- 動態調整(無需重啟)
ALTER SYSTEM SET db_cache_size = 500M;
ALTER SYSTEM SET shared_pool_size = 300M;
ALTER SYSTEM SET sga_max_size = 2G;  -- 上限

二、程序全域區 PGA — 專屬記憶體工作區

定義與特性

  • 每個 Server Process (專用伺服器) 或 Background Process 專屬
  • 非共享,進程終止時釋放
  • 包含排序區、雜湊區、Bitmap Merge 區、Session 資訊(專用伺服器模式下)

關鍵工作區

工作區用途相關參數
Sort AreaORDER BY、GROUP BY、索引建立排序SORT_AREA_SIZE (手動模式)
Hash AreaHash Join、Hash AggregationHASH_AREA_SIZE
Bitmap MergeBitmap 索引合併BITMAP_MERGE_AREA_SIZE
Create BitmapBitmap 索引建立CREATE_BITMAP_AREA_SIZE

自動 PGA 管理 (9i+ 推薦)

-- 啟用自動管理
ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=BOTH;
ALTER SYSTEM SET workarea_size_policy = AUTO;  -- 預設即為 AUTO

-- 查看 PGA 使用情況
SELECT * FROM v$pgastat;
SELECT * FROM v$process_memory WHERE pid = ;

三、使用者全域區 UGA — Session 狀態儲存

定義與雙重定位機制

UGA 儲存 Session 級狀態:Package 變數、Cursor 狀態、PL/SQL 執行上下文等。其儲存位置取決於連線模式:

連線模式UGA 位置原因
專用伺服器PGA 中每 Session 一進程,UGA 隨進程私有
共用伺服器SGA 中 (Large Pool)多 Session 共用進程,UGA 必須共享可見

驗證 UGA 位置

-- 專用伺服器:UGA 在 PGA
SELECT name, value FROM v$sesstat s
JOIN v$statname n ON s.statistic# = n.statistic#
WHERE s.sid = SYS_CONTEXT('USERENV','SID')
AND n.name LIKE '%uga%';

-- 共用伺服器:UGA 在 SGA (Large Pool)
SELECT pool, name, bytes FROM v$sgastat WHERE pool = 'large pool';

四、三大結構交互關係圖解

┌─────────────────────────────────────────────────────────────┐
│                      Oracle Instance                        │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    SGA (共享)                        │   │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐  │   │
│  │  │Buffer   │ │Shared   │ │Redo Log │ │Large     │  │   │
│  │  │Cache    │ │Pool     │ │Buffer   │ │Pool(UGA*)│  │   │
│  │  └─────────┘ └─────────┘ └─────────┘ └──────────┘  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐        │
│  │ Server Proc │  │ Server Proc │  │ Server Proc │  ...   │
│  │  (PGA)      │  │  (PGA)      │  │  (PGA)      │        │
│  │ ┌─────────┐ │  │ ┌─────────┐ │  │ ┌─────────┐ │        │
│  │ │ Sort/   │ │  │ │ Sort/   │ │  │ │ Sort/   │ │        │
│  │ │ Hash    │ │  │ │ Hash    │ │  │ │ Hash    │ │        │
│  │ │ UGA*    │ │  │ │ UGA*    │ │  │ │ UGA*    │ │        │
│  │ └─────────┘ │  │ └─────────┘ │  │ └─────────┘ │        │
│  └─────────────┘  └─────────────┘  └─────────────┘        │
└─────────────────────────────────────────────────────────────┘
* 專用伺服器模式:UGA 在 PGA;共用伺服器模式:UGA 在 SGA Large Pool

五、效能調校實戰建議

  1. SGA 總量:物理記憶體 60-80%(預留 OS 20%+)
  2. Buffer Cache 命中率:目標 > 95%(查詢 V$SYSSTAT 的 db block gets / consistent gets / physical reads)
  3. Shared Pool:避免硬解析,使用綁定變數,監控 RELOADS / INVALIDATIONS
  4. PGA 總量:DSS/倉庫環境佔大頭,OLTP 環境較小
  5. 自動記憶體管理 (11g+):MEMORY_TARGET 統一管理 SGA+PGA,簡化調校

結語

SGA、PGA、UGA 三大記憶體結構各司其職,又緊密協作。掌握其架構差異、動態調整方式與連線模式對 UGA 定位的影響,能幫助你從記憶體層面精準診斷效能瓶頸,制定最優化的資源配置策略。

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