Oracle内存结构
14.Oracle内存结构
14-1 Oracle内存结构介绍
当实例启动时,Oracle数据库会分配一块内存区域并启动后台进程。内存区域会存放如下信息:
- 程序代码
- 每个连接的会话信息,即使不是当前活动会话
- 程序执行期间所需要的信息
- 进程间共享和传递的锁的信息
- 缓存的数据,比如数据块和重做记录,而那些数据磁盘上也有
14-1-1 基本的内存结构
Oracle数据库中基本的内存结构包括:
- 系统全局区(SGA)
SGA是一组共享内存结构,也被称作SGA组件。它包含了Oracle数据库实例的数据和控制信息。SGA被所有的服务和后台进程所共享。样例数据存储在了SGA中的缓存数据块和共享SQL区域。
- 程序全局区(PGA)
一个PGA是一块独占内存区域,Oracle进程以专有的方式用它来存放数据和控制信息。当Oracle进程启动时,PGA也就由Oracle数据库创建了。
- 用户全局区(UGA)
UGA的内存分配与用户会话有关。
- 软件代码区
这块区域内存的一部分,它用来存放正在执行或可被执行代码。Oracle数据库的代码就存放其中,当然,这和普通用户程序可不一样,它们放在更为专有并受保护的地方。
图14-1说明了内存结构之间的关系
14-1-2 Oracle数据库内存管理
内存管理包括针对按需改变的数据库,要将Oracle实例的内存结构维护成最佳大小。Oracle数据库是按照与内存相关的初始化参数来管理内存。基本的内存管理操作有以下几点:
- 自动内存管理
你可以为实例的内存指定一个目标大小。当SGA和PGA按照需求要重新分配内存时,数据库实例会依据你的目标内存大小自动地调整。
- 自动共享内存管理
这种管理模式只是部分自动管理。你可以为SGA设置一个目标大小然后为PGA设置一个总计大小(或者单个管理PGA)。
- 手动内存管理
你可以设置一些初始化参数来分别管理SGA和PGA。
如果你是用DBCA创建的数据库,并且选用基本安装,那么默认就是自动内存管理。
14-2 用户全局区(UGA)概览
UGA是会话内存,它是为会话变量而分配的。所谓会话变量是那些登录信息和其他数据库会话要求的信息。从本质上讲,UGA存放着会话状态。图14-2描述着UGA。
如果一个会话向内存加载一个PL/SQL包,然后UGA就包含这个包的状态,在一个特定时间里,这个状态包含所有包的变量值。当一个包的子程序改变变量时,包的状态就会改变。默认情况下,在会话的生命周期里,包的变量是唯一并存留的。
OLAP页池也存放在UGA中。这个池管理着OLAP的数据页,它们与数据块等同。一个OLAP会话开始时也就分配页池,当会话结束,页池也就被释放。一个OLAP会话会自动打开而不论用户查询一个多维对象。
在一个数据库会话中,UGA必须可用。正是由于这个原因,当使用共享服务连接时,UGA不能存放在PGA中因为PGA是指定的单个进程。因此,当使用共享服务连接时,UGA被存放在SGA中,这样任何共享服务进程都能访问它。当使用专有服务连接时,UGA被存放在PGA中。