问题现象
数据库hang住了。
一顿检查发现结论是:
Oracle的MMAN进程在进行SGA动态调整,从shared pool中挪动部分内存到buffer cache,期间长时间持有latch:shared pool,但由于长时间无法完成shared pool的shrink,导致其他进程无法获得latch:shared pool,从而出现卡住的情况。
导致内存需要动态调整的原因在于SQL语句的物理读很高,buffer cache需要动态扩大,shared pool需要收缩,SQL语句执行又很长,需要长时间pin住,是触发问题的导火索。
问题问了:Oracle的shared pool和buffer cache区别是什么?
Oracle数据库的 Shared Pool(共享池) 和 Buffer Cache(缓冲区缓存) 是SGA(系统全局区)中两个核心且功能不同的内存组件。它们的核心区别在于缓存的内容、管理机制和性能影响。
一、核心功能与缓存内容对比
| 对比维度 | Shared Pool(共享池) | Buffer Cache(缓冲区缓存) |
|---|---|---|
| 核心功能 | 缓存“代码”和“元数据”,实现SQL、PL/SQL等对象的共享与重用,减少解析开销。 | 缓存“数据”,存储从数据文件读取的数据块副本,减少物理I/O。 |
| 主要缓存内容 | 1. Library Cache(库缓存):SQL语句、PL/SQL代码、执行计划、解析树等。 2. Dictionary Cache(数据字典缓存/Row Cache):表、列、权限等对象定义信息。 3. Server Result Cache(服务器结果缓存,可选):查询结果集。 4. 控制结构:如锁、资源等。 |
1. 用户表/索引的数据块。 2. Undo段的数据块。 3. 数据块的所有版本(当前块、CR块等)。 |
| 数据形态 | 存储的是可执行代码、元数据信息、结果集,形态和大小不固定。 |


315

被折叠的 条评论
为什么被折叠?



