2008年(239)
分类: Oracle
2008-06-18 00:11:30
1. 系统内存的空间结构
ORACLE系统的内存结构分为两个部分:系统全局区、程序全局区。系统全局区可以进一步划分为:共享池(shared pool)、缓冲区高速缓存(buffer cache)、重做日志缓冲区(redo log buffer)、大池(large pool)和JAVA池(JAVA pool),其中大池和JAVA池是可选的。具体的内存结构可见图1-4。
(1)程序全局区
程序全局区就是进程私有内存空间,是系统中代理、页清除、检查点、日志写等进程使用的一块包含数据和控制信息的内存区域,在进程启动或创建时分配,并为进程排他访问。它就是第3.2.1一节中讲到的进程缓冲区。在共享的服务器进程环境中,用户会话等相关信息存放在系统全局区的共享池或者大池中。
下列配置参数和程序全局区有关:
WORKAREA_SIZE_POLIY:设定是否启动程序全局区的内存自动管理功能。缺省为自动管理。
PGA_AGGREAGATE_TARGET:设定自动管理方式下,程序全局区使用的内存空间。
(2)系统全局区
系统全局区就是实例共享内存空间,存放数据字典、锁、要操作的用户数据等。内存空间以GRANULE为单位,可以动态地分配和回收(GRANULE是连续的内存分配单元,它的大小由SGA_MAX_SIZE配置参数来决定的。如果SGA_MAX_SIZE < 128MB,则等于4MB;否则等于16MB)。如果用户设定的值不是GRANULE的倍数,系统就自动调整到最接近的数值。
可以使用下列配置参数对整个系统全局区进行设置:
SGA_MAX_SIZE:设定系统全局区使用的最大内存空间。
(3)系统全局区的共享池
系统全局区的共享池可以进一步划分为:库高速缓存(library cache)和数据字典高速缓存(data directory cache)。下列配置参数和共享池有关:
SHARED_POOL_SIZE:设定共享池的内存空间大小。
① 库高速缓存
库高速缓存用来存放共享的SQL、PL/SQL代码以及执行计划等,供多个用户使用,减少SQL语句的再次编译,就是第3.2.4一节中讲到的SQL语句缓冲区,用户不能单独设置此部分的内存空间。
② 数据字典高速缓存
数据字典高速缓存用来存放数据字典信息,就是第3.2.2一节中讲到的数据字典缓冲区,用户不能单独设置此部分的内存空间。
(3)系统全局区的缓冲区高速缓存
系统全局区的缓冲区高速缓存用来存放从数据文件中读取的用户数据,就是第3.2.3一节中讲到的用户数据缓冲区。缓冲区高速缓存采用了多缓冲区技术,可以划为三个部分:DEFAULT、KEEP、RECYCLE,每一个部分有不同的使用方式。
下列配置参数和缓冲区高速缓存有关:
DB_CACHE_SIZE:设定DEFAULT缓冲区的大小。缺省情况下的数据访问和操作,使用此缓冲区。
DB_KEEP_CACHE_SIZE:设定KEEP缓冲区的大小。该缓冲区存放需要常驻内存的用户数据,可以根据常驻内存的用户数据数量,设置此配置参数。
DB_RECYCLE_CACHE_SIZE:设定RECYCLE缓冲区的大小。对很少或者偶尔被使用的用户数据,可以放置在这个缓冲区中。系统不会对该缓冲区中的数据使用LRU策略进行管理,数据被使用后,很快从内存中移走。
(4)系统全局区的重做日志缓冲区
系统全局区的重做日志缓冲区用来存放数据库日志信息,记录所有对数据库数据的修改,就是第3.2.5一节中讲到的日志缓冲区。下列配置参数和重做日志缓冲区有关:
LOG_BUFFER:设定重做日志缓冲区的内存空间。
(5)系统全局区的大池
大池是系统全局区的一个可选部件,只在共享的服务器进程环境中设定,用来存放会话、备份和恢复操作等信息。如果在共享的服务器进程环境中没有设定大池的话,这些信息也都存放在共享池中。下列配置参数和大池有关:
LARGE_POOL_SIZE:设定大池的内存空间。
(6)系统全局区的JAVA池
系统全局区的JAVA池为JAVA命令提供服务,存放JVM等JAVA部件,仅在安装和使用了JAVA时需要。下列配置参数和JAVA池有关:
JAVA_POOL_SIZE:设定JAVA池的内存空间。
用户数据缓冲区的管理
系统全局区的的缓冲区高速缓存就是第3.2.3一节中讲到的用户数据缓冲区,它采用多缓冲区技术,划分为:DEFAULT、KEEP、RECYCLE三个缓冲区。
存放在KEEP缓冲区中的用户数据,数据库系统启动时自动装入并驻留内存。对于经常需要访问的数据,将它们绑定到KEEP缓冲池上,可以加快数据的访问速度,避免和其它数据的内存竞争,从而提高系统性能。
存放在RECYCLE缓冲区中的用户数据,在处理完成后很快就被调出内存。对于偶尔或者很少被访问的数据,可以将它们绑定到RECYCLE缓冲区,以避免对其它数据的影响。
DEFAULT缓冲区存放未指定缓冲区的用户数据,数据库系统中大部分的用户数据处理都要在这个缓冲区中完成。只有DEFAULT缓冲区使用了LRU算法,因此在ORACLE系统中,对用户数据缓冲区的管理就是对DEFAULT缓冲区的管理。
对DEFAULT缓冲区的管理,ORACLE系统使用了两个链:LRU LIST和DIRTY LIST。
LRU LIST链指向DEFAULT缓冲区中的数据块,按照数据块被访问的时间顺序排序。越靠近LRU LIST链的顶端,所对应的数据块越是在最近的时间被访问;越靠近LRU LIST链的底端,所对应的数据块越是有较长的时间没有被访问。
当服务器进程处理数据时,首先在整个数据高速缓存中查找所要处理的数据,有以下两种结果:
(1)找到所需数据。不管该数据存放在数据高速缓存的什么位置,系统把该内存页联接到LRU LIST链的顶端,整个数据高速缓存的LRU LIST链就相应地由上向下进行移动。
(2)没有找到所需数据。系统从LRU LIST链的底端找到可用的内存空间,将读入的数据块存入对应的内存缓冲区中,再将指向这些内存数据块的指针放置在LRU LIST链的顶端,然后开始数据的处理。
DIRTY LIST链记录内存缓冲区中已经发生了更新的数据块。如果已经被更新数据块达到了系统设定的极限值,或者服务器进程无法从LRU LIST链的底端获取足够的内存空间时,系统就指示数据库书写器进程,根据DIRTY LIST链,将这些已经被改变的数据块写回到磁盘中。