Oracle 的 SGA、PGA、实例和数据库分别是什么?
简化版
Oracle 实例由内存结构和后台进程组成,数据库是磁盘上的数据文件、控制文件、Redo 日志等物理文件。SGA 是实例共享内存,供多个会话共同使用;PGA 是每个服务进程或会话私有内存,主要用于排序、哈希、游标状态等操作。
详细版
Oracle 面试经常先问体系结构。要把几个概念分清:
- 数据库:磁盘上的数据文件、控制文件、联机 Redo 日志、归档日志等。
- 实例:SGA 加后台进程,是访问数据库的运行时环境。
- SGA:共享内存,包括 Buffer Cache、Shared Pool、Redo Log Buffer 等。
- PGA:进程私有内存,包括排序区、哈希区、会话状态等。
- 后台进程:如 DBWn、LGWR、CKPT、SMON、PMON、ARCn。
一句工程化理解是:SGA 负责共享缓存和协作,PGA 负责单个会话的私有计算,后台进程负责把内存状态安全、高效地落到磁盘。
完整版教学
一、实例和数据库不是同一个东西
Oracle 里“实例”和“数据库”经常被混着说,但面试时要分开。数据库是磁盘上的一组物理文件,实例是启动后的一组内存结构和后台进程。
一个实例可以 mount 并 open 一个数据库。RAC 场景下,多个实例可以同时访问同一个数据库,这也是为什么理解实例和数据库的区别很重要。
实例 = SGA + 后台进程
数据库 = 数据文件 + 控制文件 + Redo 日志文件 + 归档日志等
记忆钩子:实例是“运行时”,数据库是“磁盘文件集合”。实例挂了不等于数据文件没了。
二、SGA 是实例共享内存
SGA 是 System Global Area,它是实例级共享内存。多个会话访问同一个实例时,会共享 SGA 中的缓存、SQL 解析结果和日志缓冲。
SGA 常见组成包括:
| 组件 | 作用 |
|---|---|
| Database Buffer Cache | 缓存数据块 |
| Shared Pool | 缓存 SQL、执行计划、数据字典 |
| Redo Log Buffer | 缓存 redo 记录 |
| Large Pool | 并行、备份等大内存操作 |
SGA 的目标是减少磁盘 IO、减少重复解析,并在多个会话之间共享可复用信息。
三、PGA 是私有工作区
PGA 是 Program Global Area,它属于某个服务进程或会话,不像 SGA 那样被所有会话共享。排序、哈希连接、游标状态、会话变量等常常使用 PGA。
比如一个 SQL 需要对 100 万行排序,如果 PGA 足够,排序可以主要在内存中完成;如果不够,就可能溢写临时表空间。
order by 100 万行
PGA 足够 -> 内存排序
PGA 不足 -> 使用 TEMP 表空间做外部排序
这也是为什么复杂报表 SQL 常常会同时关注 PGA 和 TEMP 使用情况。
四、Buffer Cache 缓存的是数据块
Oracle 读写数据的基本单位是数据块。查询某行数据时,数据库会把对应数据块读入 Buffer Cache,后续访问相同块可以直接从内存读取。
修改数据时,Oracle 通常先修改 Buffer Cache 中的数据块,形成脏块,再由 DBWn 后台进程择机写回数据文件。
磁盘数据块 -> Buffer Cache -> 会话读取或修改
脏块 -> DBWn -> 数据文件
所以提交事务并不要求数据块立刻写回数据文件,提交安全主要依赖 redo 已经写入日志。
五、Shared Pool 影响 SQL 解析和执行计划复用
Shared Pool 中有 Library Cache 和 Data Dictionary Cache。Library Cache 缓存 SQL 解析结果、执行计划、PL/SQL 对象等。
如果应用大量拼接字面量 SQL,例如 where id = 1、where id = 2、where id = 3,数据库可能产生大量硬解析,Shared Pool 压力上升。
绑定变量可以提升 SQL 复用:
select * from orders where id = :id;
这样不同 ID 可以复用同一类 SQL 结构,减少解析和共享池压力。
六、后台进程各司其职
Oracle 后台进程负责维护实例运行。常见进程要能说出几个:
- DBWn:把脏数据块写回数据文件。
- LGWR:把 Redo Log Buffer 写入联机 Redo 日志。
- CKPT:触发检查点并更新文件头信息。
- SMON:实例恢复和空间清理。
- PMON:清理异常断开的会话资源。
- ARCn:归档联机 Redo 日志。
面试不要求背所有进程,但 DBWn 和 LGWR 的分工要非常清楚。
七、常见误区与追问
- 误区:提交事务就是把数据块写入数据文件。 提交关键是 redo 持久化,数据块可以稍后由 DBWn 写回。
- 误区:SGA 和 PGA 都是共享内存。 SGA 是实例共享,PGA 是进程或会话私有。
- 误区:实例宕机意味着数据文件损坏。 实例是运行时,宕机后可通过 redo 做实例恢复。
- 追问:为什么绑定变量能减轻 Shared Pool 压力? 因为 SQL 结构相同,解析结果和执行计划更容易复用。
- 追问:PGA 不够会发生什么? 排序、哈希等操作可能使用 TEMP 表空间,SQL 延迟和 IO 上升。
- 追问:DBWn 和 LGWR 谁对提交更关键? LGWR 更直接关联提交持久性,DBWn 负责脏块写回。
八、面试中可以这样串起来
可以按一次更新流程讲体系结构:会话执行 SQL,Shared Pool 查找或生成执行计划;数据块进入 Buffer Cache;修改产生 redo 到 Redo Log Buffer;提交时 LGWR 写 redo;脏块稍后由 DBWn 写入数据文件。
SQL -> Shared Pool
数据块 -> Buffer Cache
修改 -> Redo Log Buffer
commit -> LGWR 写 redo
后台 -> DBWn 写脏块
这样回答能把 SGA、PGA、后台进程、提交机制连成一条线,而不是孤立背名词。
九、加强记忆
Oracle 体系结构记住“实例等于 SGA 加后台进程,数据库等于磁盘文件”。SGA 共享缓存,PGA 私有计算;LGWR 管提交安全,DBWn 管脏块落盘。面试时用一次 SQL 更新流程串起来,比单独罗列组件更有说服力。