内存架构生死战:详解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.SGA:System Global Area 系统全局区
本质定义:
SGA是一块在实例启动时分配、所有进程共享的巨大内存池。它是一块“公共黑板”,张三写了数据李四能立刻看到,不需要刷盘。
核心特征(三个“共享”):
- 共享访问:所有用户进程都能读写SGA中的特定区域。
- 共享竞争:因为共享,所以需要“门闩”(Latch)和“队列”(Lock)来保护内存块,这是高并发热点。
- 实例级生命周期:数据库实例启动时分配,关闭时释放。
2.PGA:Program Global Area 程序全局区
本质定义:
PGA是每个服务进程私有的、独占的内存区。它不是一块整体,而是与每个会话一一对应。它是一张“私有草稿纸”,你草稿上的中间结果别人看不到,也不需要锁保护。
核心特征(三个“私有”):
- 进程独占:进程A无法读取进程B的PGA数据。
- 工作区域:主要用于存放排序、哈希连接等操作的临时中间结果。
- 会话级生命周期:会话创建时分配,结束后释放。
差异化对比表:
| 对比维度 | SGA(系统全局区) | PGA(程序全局区) |
|---|---|---|
| 所有权 | 实例级,全库共享 | 进程级,会话独占 |
| 主要内容 | 数据块缓存、解析过的SQL、锁信息 | 会话信息、排序临时空间、游标状态 |
| 调优痛點 | 争夺Library Cache Latch、Buffer Busy Waits | 磁盘排序过多、PGA内存溢出耗尽 |
| 管理方式 | ASMM自动共享内存管理 | 自动PGA管理(PGA_AGGREGATE_TARGET) |
| 关键参数 | SGA_TARGET, SGA_MAX_SIZE | PGA_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分为两部分:
- 私有SQL区(持久区):存绑定变量、游标状态。生命周期随游标关闭而释放。
- 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_ADVICE和V$SGA_TARGET_ADVICE是你的调优罗盘。
七、总结:平衡的艺术
SGA是共享的丰巢柜,解决所有用户共性的缓存需求;PGA是私人的密码箱,解决单个进程个性的计算需求。一个优秀的DBA,就是在SGA的内存命中率与PGA的工作区溢出之间找到那个完美的资源配比。
对于SGA和PGA的配置,你更倾向于使用MEMORY_TARGET的一刀切全自动托管,还是分开设置去压榨最后一点性能?欢迎在评论区写下你的运维哲学。
🌺The End🌺点点关注,收藏不迷路🌺 ⬆ ⬆ 顶部 ⬆ ⬆ |