← 返回题目列表

Oracle 的 SGA、PGA、实例和数据库分别是什么?

高频 中等 第 4 / 32 题 更新于 2026/07/29
OracleSGAPGA实例体系结构

简化版

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 = 1where id = 2where 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 更新流程串起来,比单独罗列组件更有说服力。