内存架构生死战:详解Oracle SGA与PGA的作用与调优艺术
2026/7/11 19:49:06 网站建设 项目流程

内存架构生死战:详解Oracle SGA与PGA的作用与调优艺术

    • 一、开篇暴击:一个连接引发的血案
    • 二、全景对比流程图:SQL执行时的SGA与PGA协作
    • 三、核心定义:透析SGA与PGA的本质区别
      • 1.SGA:System Global Area 系统全局区
      • 2.PGA:Program Global Area 程序全局区
    • 四、SGA的“五脏六腑”:必须搞懂的5大池子
      • 1.数据库缓冲区缓存(Database Buffer Cache)
      • 2.共享池(Shared Pool)
      • 3.重做日志缓冲区(Redo Log Buffer)
      • 4.大池(Large Pool)
      • 5.Java池与流池(Java Pool & Streams Pool)
    • 五、PGA的“工作车间”:排序与哈希的秘密
    • 六、黄金参数配置:自动内存管理的正确姿势
      • 1.物理内存预估法
      • 2.独立控制模式(更精细)
    • 七、总结:平衡的艺术

🌺The Begin🌺点点关注,收藏不迷路🌺

⬇ ⬇ 底部 ⬇ ⬇

一、开篇暴击:一个连接引发的血案

假设你是一家电商的DBA,大促期间数据库突然变慢,CPU飙到100%。登录系统后发现:没有死锁,SQL逻辑没变,但磁盘I/O暴增。

问题根源往往不在于磁盘,而在于内存。准确地说,是SGA(系统全局区)PGA(程序全局区)的配置失衡,导致Oracle被迫用磁盘当内存使。今天我们就来一次说透,Oracle内存架构中这对“黄金搭档”到底是如何分工的。


二、全景对比流程图:SQL执行时的SGA与PGA协作

在深入理论前,先通过一张流程图看清一条SQL从发起到返回结果,是如何在SGA和PGA之间流转的。请重点关注橘色(PGA私有区)和蓝色(SGA共享区)的切换逻辑:

SGA专属职责

PGA专属职责

实例内存架构

客户端

1.专用连接

2.传递SQL文本

3.软解析直接执行

3.硬解析需查询字典

4.构建执行计划

5.内存命中返回

5.未命中触发物理读

6.结果集返回

7.数据发送

私有内存区

共享内存区

用户发送SQL

PGA-私有SQL工作区

SGA-共享池-库缓存

PGA-排序/哈希区

SGA-共享池-字典缓存

请求数据块

SGA-数据库缓冲区缓存

DBWn读数据文件

排序/哈希/位图合并

数据缓存/锁管理/重做缓冲


三、核心定义:透析SGA与PGA的本质区别

1.SGA:System Global Area 系统全局区

本质定义:
SGA是一块在实例启动时分配、所有进程共享的巨大内存池它是一块“公共黑板”,张三写了数据李四能立刻看到,不需要刷盘。

核心特征(三个“共享”):

  1. 共享访问:所有用户进程都能读写SGA中的特定区域。
  2. 共享竞争:因为共享,所以需要“门闩”(Latch)和“队列”(Lock)来保护内存块,这是高并发热点。
  3. 实例级生命周期:数据库实例启动时分配,关闭时释放。

2.PGA:Program Global Area 程序全局区

本质定义:
PGA是每个服务进程私有的、独占的内存区。它不是一块整体,而是与每个会话一一对应。它是一张“私有草稿纸”,你草稿上的中间结果别人看不到,也不需要锁保护。

核心特征(三个“私有”):

  1. 进程独占:进程A无法读取进程B的PGA数据。
  2. 工作区域:主要用于存放排序、哈希连接等操作的临时中间结果。
  3. 会话级生命周期:会话创建时分配,结束后释放。

差异化对比表:

对比维度SGA(系统全局区)PGA(程序全局区)
所有权实例级,全库共享进程级,会话独占
主要内容数据块缓存、解析过的SQL、锁信息会话信息、排序临时空间、游标状态
调优痛點争夺Library Cache Latch、Buffer Busy Waits磁盘排序过多、PGA内存溢出耗尽
管理方式ASMM自动共享内存管理自动PGA管理(PGA_AGGREGATE_TARGET)
关键参数SGA_TARGET, SGA_MAX_SIZEPGA_AGGREGATE_TARGET, WORKAREA_SIZE_POLICY

四、SGA的“五脏六腑”:必须搞懂的5大池子

SGA不是一整块铁板,它内部划分了精细的功能区。配置不当会导致经典的“内存抖震”。

1.数据库缓冲区缓存(Database Buffer Cache)

  • 作用:存放从数据文件读取的数据块副本。查询与修改的第一站。
  • 色彩定位:绿色——数据的高速公路服务区。
  • 灾难场景:如果太小,Oracle会频繁老化热点数据,导致高代价的物理读I/O。

2.共享池(Shared Pool)

  • 作用:分为库缓存(存SQL/PLSQL代码)和字典缓存(存数据字典元数据)。
  • 色彩定位:蓝色——编译器的缓存与字典的目录。
  • 硬解析之痛:如果不使用绑定变量,每一条SQL都硬解析一遍,库缓存瞬间被撑爆,CPU全耗在解析而非执行上。

3.重做日志缓冲区(Redo Log Buffer)

  • 作用:小而快的循环缓冲区,记录数据变更的“重做记录”。
  • 色彩定位:橘色——数据的黑匣子飞行记录仪。
  • 核心规则:LGWR必须将这里的记录写到磁盘日志文件后,事务才算提交完成。

4.大池(Large Pool)

  • 作用:分担共享池的压力,专门给RMAN备份、共享服务器会话内存使用。
  • 色彩定位:紫色——共享池的“减负外挂”。

5.Java池与流池(Java Pool & Streams Pool)

  • 作用:特定功能池,数据库内跑Java代码或使用Streams复制时启用。
  • 色彩定位:红色——特种兵专用装备库。

五、PGA的“工作车间”:排序与哈希的秘密

PGA分为两部分:

  1. 私有SQL区(持久区):存绑定变量、游标状态。生命周期随游标关闭而释放。
  2. SQL工作区(运行时区):排序、哈希连接、位图索引合并全在这里发生。

单次操作的内存模型(按操作类型分):

操作类型PGA工作区需求内存不足时的影响
排序(ORDER BY)存放全排序或归并排序的中间段溢出到临时表空间磁盘排序(极慢)
哈希连接(HASH JOIN)构建哈希表必须分片做哈希,反复扫描大表
位图索引合并存放各片段位图频繁的DML操作会导致位图膨胀

六、黄金参数配置:自动内存管理的正确姿势

现代Oracle(10g后)推荐使用自动内存管理,但两个关键阈值一定要设对。

1.物理内存预估法

  • 总物理内存减去操作系统所需的余量,留给Oracle。
  • MEMORY_TARGET:给Oracle的总内存(含SGA+PGA),0表示禁用。
  • MEMORY_MAX_TARGET:上限值,不可在线动态调大。

2.独立控制模式(更精细)

-- 修改SGA大小(需重启生效如果超过SGA_MAX_SIZE)ALTERSYSTEMSETSGA_TARGET=2G SCOPE=SPFILE;-- 修改PGA总量(即时生效)ALTERSYSTEMSETPGA_AGGREGATE_TARGET=1G;

最佳实践建议:

  • OLTP系统:SGA占Oracle总内存的80%,PGA占20%。(重点缓存热点数据块和执行计划)
  • OLAP/DSS系统:PGA占Oracle总内存的50%~60%。(排序和哈希连接需要巨大的工作区)
  • 监控视图:V$PGA_TARGET_ADVICEV$SGA_TARGET_ADVICE是你的调优罗盘。

七、总结:平衡的艺术

SGA是共享的丰巢柜,解决所有用户共性的缓存需求;PGA是私人的密码箱,解决单个进程个性的计算需求。一个优秀的DBA,就是在SGA的内存命中率与PGA的工作区溢出之间找到那个完美的资源配比。

对于SGA和PGA的配置,你更倾向于使用MEMORY_TARGET的一刀切全自动托管,还是分开设置去压榨最后一点性能?欢迎在评论区写下你的运维哲学。



🌺The End🌺点点关注,收藏不迷路🌺

⬆ ⬆ 顶部 ⬆ ⬆

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询