当实例启动时,oracle数据库会分配一块内存区域并启动后台进程。olap页池也存放在uga中。这个池管理着olap的数据页,它们与数据块
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中。