甲骨文数据库内存结构简介
当实例启动时,甲骨文数据库会分配一个内存区域并启动后台进程。
内存区域存储信息,例如:
程序代码
有关每个连接会话的信息,即使它当前不活跃
程序执行过程中所需的信息,例如,正在获取行的查询的当前状态
进程之间共享和通信的锁数据等信息
缓存数据,如数据块和重做记录,也存在于磁盘上
基本记忆结构
甲骨文数据库包含几个内存区域,每个内存区域都包含多个子组件。
甲骨文数据库内存管理
内存管理涉及根据数据库变化的需求,保持甲骨文实例内存结构的最佳大小。甲骨文数据库根据内存相关初始化参数的设置来管理内存。
基本记忆结构
包括系统全球区域(SGA),计划全球区域(PGA),用户全球区域(UGA),软件代码区域
内存图:

用户全球区域概述
UGA是会话内存,是分配给会话变量的内存,如登录信息和数据库会话所需的其他信息。从本质上讲,UGA存储会话状态。
下图描绘了UGA。

UGA 的存储位置
- 共享服务器模式(MTS):UGA 存储在 SGA 的共享服务器池中;
- 专用服务器模式(Dedicated Server):UGA 存储在对应服务器进程的 PGA 中。
全球项目区域(PGA)概述
PGA是特定于操作系统进程或线程的内存,系统上的其他进程或线程不共享。由于PGA是特定于过程的,它从未在SGA中分配过。

PGA 的核心子组件
- 排序区(Sort Area) :存储排序操作的中间结果,如
ORDER BY
、GROUP BY
; - 哈希区(Hash Area):存储哈希连接(Hash Join)的中间数据;
- 位图合并区(Bitmap Merge Area):处理位图索引合并操作;
- 绑定变量区(Bind Area):存储 SQL 语句中的绑定变量值;
- 会话游标状态(Session Cursor State):记录游标执行状态和结果集。

系统全球区域(SGA)概述
SGA是一个读/写内存区域,与甲骨文后台进程一起形成一个数据库实例。
下下面是其组件组成:
数据库缓冲缓存,也称为缓冲缓存,是存储从数据文件中读取的数据块副本的内存区域。
重做日志缓冲区是SGA中的一个循环缓冲区,用于存储描述对数据库所做的更改的重做条目
共享池缓存各种类型的程序数据。
大型池是一个可选的内存区域,用于分配大于适合共享池的内存。
Java池是一个内存区域,在Java虚拟机(JVM)中存储所有特定于会话的Java代码和数据。此内存包括在调用结束时迁移到Java会话空间的Java对象。
固定 的SGA是一个内部家政服务区。
某些SGA子区域仅为特定性能功能启用。
数据库缓冲缓存
数据库缓冲缓存,也称为缓冲缓存,是存储从数据文件中读取的数据块副本的内存区域。
模式不同如下:
当前模式
当前模式获取,也称为db块获取,是当前出现在缓冲缓存中的块的检索。例如,如果未提交的事务更新了一个块中的两行,那么当前模式get会检索包含这些未提交的行的块。数据库在修改语句期间最频繁地使用db块,只能更新当前版本的块。
一致模式
一致读取获取是检索块的读取一致版本。此检索可能会使用撤销数据。例如,如果未提交事务更新了块中的两行,并且如果单独会话中的查询请求该块,那么数据库将使用撤销数据创建该块的读取一致版本(称为一致读取克隆),该版本不包括未提交的更新。通常,查询以一致模式检索块。
重做日志缓冲区
重做日志缓冲区是SGA中的一个循环缓冲区,用于存储描述对数据库所做的更改的重做条目。
数据库进程将重做条目从用户内存空间复制到SGA中的重做日志缓冲区。重做条目占用缓冲区中的连续、顺序的空间。后台进程日志写入器进程(LGWR)将重做日志缓冲区写入磁盘上的活动在线重做日志组。

LGWR按顺序重写到磁盘,而DBW则对数据块进行分散写入磁盘。分散写入往往比顺序写入慢得多。
共享池
共享池缓存各种类型的程序数据。
例如,共享池存储解析的SQL、PL/SQL代码、系统参数数据字典信息。共享池几乎参与数据库中发生的每个操作。例如,如果用户执行SQL语句,那么Oracle数据库将访问共享池。

保留池
保留池是共享池中的内存区域,甲骨文数据库可用于分配大量连续的内存块。
数据库从共享池中分块分配内存。Chunking允许将大型对象(超过5 KB)加载到缓存中,而无需单个连续区域。通过这种方式,数据库减少了因碎片化而连续内存耗尽的可能性。
大游泳池(用于推迟插入的大型池式緩衝器)
大型池是一个可选的内存区域,用于分配大于适合共享池的内存。
大型池可以为以下内容提供大量内存分配:
-
用于共享服务器和ORACLE ------XA接口的UGA(用于交易与多个数据库交互)
-
并行执行中使用的消息缓冲区
-
恢复管理器(RMAN)I/O从属的緩衝
-
推迟插入的緩衝區(带有
MEMOPTIMIZE_WRITE
提示的插入)

对于一种被称为递延插入的特殊类型的插入,数据库从大池中分配缓冲区。

Java池是一个内存区域,在Java虚拟机(JVM)中存储所有特定于会话的Java代码和数据。此内存包括在调用结束时迁移到Java会话空间的Java对象。
Java池顾问统计数据提供了有关Java使用的库缓存内存的信息,并预测Java池大小的变化如何影响解析率。当statistics_level
设置为TYPICAL
或更高时,Java池顾问在内部打开。当 Advisor(技术顾问)关机时,这些统计数据会重置。
固定的SGA
固定 的SGA是一个内部家政服务区。
例如,固定的SGA包含:
-
后台进程需要访问的有关数据库和实例状态的一般信息
-
流程之间通信的信息,例如有关锁的信息。
内存区
内存区域是一个可选的SGA组件,其中包含内存列存储(IM列存储)。
IM列存储包含表、分区和实体化视图的副本,其格式为快速扫描进行了优化。IM列存储补充数据库缓冲缓存,该缓存以传统行格式存储数据。
软件代码区域概述
软件代码区域是存储正在运行或可以运行的代码的内存的一部分。甲骨文数据库代码存储在软件区域中,该区域通常比用户程序的位置更专有和受保护。
软件区域通常大小是静态的,只有在更新或重新安装软件时才会更改。这些区域所需的大小因操作系统而异。