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

Oracle SGA 核心組件深度解析:結構、參數與調優實戰

     編輯:Oracle 資料庫基礎

前言

System Global Area (SGA) 是 Oracle 實例啟動時分配的共享內存區域,所有背景進程與服務器進程通過它協作。深入理解 SGA 七大組件的功能、控制參數、相互關係與調優策略,是 Oracle 性能優化的基石。本文系統梳理 SGA 內部架構,並給出生產環境參數配置建議。

SGA 七大核心組件架構圖


+--------------------------------------------------------------+
|                         SGA                                  |
|  +----------------+  +----------------+  +----------------+  |
|  | Fixed SGA      |  | Database Buffer|  | Redo Log Buffer|  |
|  | (固定區)       |  | Cache (緩存)   |  | (重做日志緩存) |  |
|  +----------------+  |  - Default Pool|  +----------------+  |
|                      |  - Keep Pool   |  +----------------+  |
|  +----------------+  |  - Recycle Pool|  | Java Pool      |  |
|  | Shared Pool    |  +----------------+  | (Java 池)      |  |
|  | (共享池)       |  +----------------+  +----------------+  |
|  |  - Library Cache|  | Large Pool     |  | Streams Pool   |  |
|  |  - Data Dict   |  | (大池)         |  | (流池)         |  |
|  |  - Result Cache|  +----------------+  +----------------+  |
|  +----------------+                      |                |
+--------------------------------------------------------------+

各組件功能詳解與關鍵參數

1. Fixed SGA (固定 SGA)

  • 功能:實例啟動時固定大小的控制結構,指向其他 SGA 組件的指針、鎖結構、平台相關常量。「SGA 的地圖」。
  • 大小:由 Oracle 內部決定,通常數百 KB,**不可調整**,不佔用 SGA_TARGET 額度。

2. Database Buffer Cache (數據庫緩存)

  • 核心使命:緩存從磁盤讀取的數據塊,支撐「邏輯讀替代物理讀」,是 OLTP 性能關鍵。
  • 三大子池:
    • Default Pool:默認緩存所有對象,DB_CACHE_SIZE 控制。
    • Keep Pool:釘住熱點小表/索引 (如參數表、代碼表),DB_KEEP_CACHE_SIZE 控制,**不被 LRU 淘汰**。
    • Recycle Pool:大表全掃描數據、一次性數據,DB_RECYCLE_CACHE_SIZE 控制,**快速淘汰**,保護 Default Pool。
  • 多塊大小支援 (9i+):DB_nK_CACHE_SIZE (n=2,4,8,16,32) 為非標準塊大小表空間分配獨立緩存。
  • 關鍵參數:DB_CACHE_SIZE、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE、DB_nK_CACHE_SIZE、DB_BLOCK_SIZE (實例級,不可動態修改)。

3. Redo Log Buffer (重做日志緩存)

  • 功能:事務重做條目 (Redo Entry) 先寫入此處,由 LGWR 批量刷盤到 Online Redo Log 文件,保證事務持久化 (WAL 協議)。
  • 觸發刷盤條件:
    1. 每 3 秒
    2. 緩存佔用達 1/3 或 1MB
    3. 用戶提交 (COMMIT)
    4. 檢查點 (CKPT) / 切換日誌組 / 正常關閉
  • 關鍵參數:LOG_BUFFER (靜態參數,需重啟生效)。預設 MAX(512KB, 128KB * CPU_COUNT)。典型值 1-10MB,**過大無益處、反增崩潰恢復時間**。

4. Java Pool (Java 池)

  • 功能:存儲數據庫內運行的 Java 代碼狀態 (Session-specific Java state)、類定義、JIT 編譯代碼。**僅用於 Oracle JVM 內部執行的 Java (如 Java Stored Procedure),與應用服務器 (Tomcat/WebLogic) 無關。**
  • 關鍵參數:JAVA_POOL_SIZE。不使用 Java Stored Procedure 時設 0 或極小 (如 16MB)。

5. Large Pool (大池)

  • 三大用途:
    1. 並行查詢:PX 進程間消息緩存 (PARALLEL_AUTOMATIC_TUNING=TRUE 時自動使用)。
    2. RMAN 備份/恢復:磁盤 I/O 緩存 (配置 BACKUP_DISK_IO_SLAVES 或 _BACKUP_KSFQ_BUFZ 相關)。
    3. 共享服務器 (MTS):UGA (User Global Area) 從 SGA 大池分配,而非 PGA。
  • 關鍵參數:LARGE_POOL_SIZE。專用服務器模式下建議 16-64MB (僅供並行/RMAN);共享服務器模式需根據併發會話估算 UGA 大小 (每會話 ~100KB-1MB)。

6. Shared Pool (共享池) - 最複雜、最關鍵

  • 核心子組件:
    • Library Cache:SQL/PLSQL 解析樹、執行計劃、鎖/釘狀態。**硬解析極其消耗 CPU/Latch,軟解析依賴此處命中。**
    • Data Dictionary Cache:數據字典元數據 (表/列/權限/同義詞定義)。
    • Result Cache (11g+):查詢結果集緩存 (RESULT_CACHE_MODE 控制)。
    • Reserved Pool:大對象 (如大 PLSQL 包) 分配保留區,防碎片化。
  • 關鍵參數:
    • SHARED_POOL_SIZE:9i 控制最大子組件,10g+ 控制共享池總大小 (含 Reserved Pool)。
    • SHARED_POOL_RESERVED_SIZE:保留區大小 (默認 5%)。
    • CURSOR_SHARING:EXACT (默認/推薦) / FORCE / SIMILAR (已廢棄)。**綁定變量是根治硬解析的正道,FORCE 只是權宜之計且副作用大。**
    • OPEN_CURSORS:會話最大打開游標數,防洩漏 (典型 300-1000)。
  • 調優鐵律:
    1. 命中率:Library Cache Hit Ratio > 99%、Dictionary Cache Hit Ratio > 95%。
    2. 硬解析率:Hard Parse / Total Parse < 1%。
    3. Latch 爭用:library cache, shared pool latch 睡眠比 < 1%。
    4. 根治手段:綁定變量、CURSOR_SPACE_FOR_TIME、SESSION_CACHED_CURSORS、大包拆分、Result Cache。盲目增大 SHARED_POOL_SIZE 往往加劇 Latch 爭用、延長掃描鏈、惡化性能。

7. Streams Pool (流池) (10g+)

  • 功能:Oracle Streams (捕獲/傳播/應用)、XStream、GoldenGate 整合、Advanced Queuing (AQ) 緩存。
  • 關鍵參數:STREAMS_POOL_SIZE。未使用 Streams 技術時設 0。

內存管理模式對比與參數配置模板

1. 自動共享內存管理 (ASMM) - 10g+ 推薦

*.memory_target = 0              # 關閉 AMM (實例+PGA 全自動),採用 ASMM
*.sga_target = 6G                # SGA 總大小 (動態調整各組件)
*.shared_pool_size = 512M        # 共享池最小保障 (動態可增)
*.db_cache_size = 2G             # Default Pool 最小保障
*.large_pool_size = 64M          # 大池最小保障
*.java_pool_size = 32M           # Java 池最小保障
*.log_buffer = 2M                # 靜態,需重啟
*.db_keep_cache_size = 256M      # Keep Pool 固定
*.db_recycle_cache_size = 128M   # Recycle Pool 固定
*.streams_pool_size = 0          # 不用 Streams
*.statistics_level = TYPICAL     # 必須 TYPICAL 或 ALL,否則 ASMM 失效

2. 手動管理 (9i/靜態環境)

需手動平衡所有組件,總和 < 物理內存 - PGA - OS 預留。32 位系統 SGA+PGA 限制 1.75GB (Windows) / 2.7GB (Linux /3GB 啟動參數)。

3. 典型配置參考 (64 位 Linux, 專用服務器, OLTP)

物理內存SGA_TARGETSHARED_POOL_SIZE (最小)DB_CACHE_SIZE (最小)PGA_AGGREGATE_TARGET
16 GB8 GB512 MB4 GB4 GB
32 GB16 GB1 GB8 GB8 GB
64 GB32 GB2 GB16 GB16 GB
128 GB64 GB3 GB32 GB32 GB

註:Keep/Recycle/nK Cache 另加。PGA 另行規劃。HugePages 強烈建議啟用 (vm.nr_hugepages)。

監控與診斷關鍵視圖

視圖核心指標用途
V$SGA各組件當前大小驗證 ASMM 動態調整結果
V$SGAINFO組件大小、可調性快速概覽
V$BH / X$KCBOQH緩存命中率、髒塊、LRU 狀態Buffer Cache 深度分析
V$LIBRARYCACHEGETS, PINS, RELOADS, INVALIDATIONSLibrary Cache 命中/硬解析
V$ROWCACHEGETS, GETMISSES, MODIFICATIONSData Dictionary Cache
V$LATCH / V$LATCH_CHILDRENGETS, MISSES, SLEEPS, IMMEDIATE_GETSLatch 爭用熱點 (cache buffers chains, library cache, shared pool)
V$SGA_RESIZE_OPSASMM 自動調整操作歷史觀察動態調整頻率/幅度
V$SGA_TARGET_ADVICE不同 SGA_TARGET 下預估 DB_TIME容量規劃、調優決策依據

結語

SGA 不是簡單的「內存大餅」,而是精密協作的七大組件集合。調優核心在於:Buffer Cache 承擔讀壓力、Shared Pool 承擔解析壓力、Redo Log Buffer 承擔寫持久化、Large Pool 承擔並行/備份/共享服務壓力。採用 ASMM (SGA_TARGET) 為主、關鍵組件設最小保障為輔,配合 綁定變量消除硬解析、HugePages 消除頁表開銷、Keep/Recycle 池隔離熱冷數據,才能榨乾內存性能。記住:參數調整是手段,消除應用層反模式 (無綁定、大事務、全表掃) 才是本質。

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