2009年2月19日星期四

内存结构memory architecture

oracle在内存中存储以下信息:
程序代码
已连接的会话(session)信息,包括当前活动(active)的及非活动的会话
程序执行过程中所需的信息(例如:某个查询的状态)
需要在oracle进程间共享并进行通信的信息(例如锁信息)
数据文件内数据的缓存(例如:数据块data block及重做日志条目redo log entry)
oracle中的基本内存结构包括:
系统全局区system global area SGA:此区域由所有的服务进程(server process)和后台进程(background process)共享。
程序全局区program global area PGA:此区域是每个服务进程和后台进程所私有的,即每个进程都有一个属于自己的PGA。
oracle的基本内存结构还包括软件代码区(software code area)
一、系统全局区概述overview of the system global area
系统全局区(system global area SGA)是一组包含了oracle数据库数据及实例控制信息的共享的内存结构。当多个用户并发地连接到同一个实例后,这些用户将共享此实例SGA中的数据。因此SGA也被称为共享全局区(shared global area)
oracle实例是由SGA及oracle进程两部分组成的。当用户启动实例时,oracle将自动地为SGA分配内存,当用户关闭实例时,由操作系统负责回收内存。每个实例都有自己的SGA。
SGA是可读写的。当用户连接到一个多进程数据库实例(multiple-process database instance)后能够读取此实例SGA中的信息,有些进程在oracle执行期间可以向SGA中写入信息。
SGA中包含以下数据结构:
数据缓存区database buffer cache
重做日志缓冲区redo log buffer
共享池shared pool
JAVA池java pool
大型池large pool (可选的)
数据流池streams pool
数据字典缓存区data dictionary cache
其他杂项信息
SGA中还包含了数据库及实例的状态信息,供后台进程使用。这部分内容被称为固定SGA(fixed SGA)。用户数据不会存储在这个区域内。SGA中还包含需要在oracle进程间进行交换的信息(例如锁信息)
如果数据库运行在共享服务模式(shared server architecture)下,SGA中还要包含请求与应答队列,以及PGA中的一些信息。
1、初始化参数SGA_MAX_SIZE the SGA_MAX_SIZE Initialization Parameter
SGA中包含了多个内存组件(component),每个组件都可以被看作一个内存池,用于满足特定类型的内存分配请求。所有SGA组件都是以预设的雷杜(granule)为单位进行内存的分配(allocate)和回收(deallocate)的。oracle通过记录每个SGA组件使用的粒度单位的数量来掌握整个SGA的内存使用情况。
粒度单位的大小是由整个SGA的容量决定的。
用户可以设定oracle数据库实例的SGA能够使用的内存总数量。oracle在启动一个实例之初只会为此实例分配最小所需的内存,而在实例运行期间可以通过扩展各个SGA组件来为实例提供更多内存,SGA所使用内存的上限由SGA_MAX_SIZE初始化参数决定。在实例初始化时,如果初始化参数文件(initialization parameter file)或服务器参数文件(server parameter file)中的SGA_MAX_SIZE的值小于oracle为SGA组件分配的内存之和(为SGA各组件分配的内存数量是依据参数文件中的显式(explicitly)设定值或系统默认值),oracle将忽略SGA_MAX_SIZE参数。
注:为了优化系统性能,整个SGA的容量应该与实际需要的内存数量相符,如果系统内存太小,SGA会需要使用虚拟内存(virtual memory),数据库的系统性能将显著下降。因为此时操作系统需要对SGA中的部分内容进行分页(page)(即在磁盘上进行读写操作)。SGA中各个内存组件的容量会对数据库系统的性能有所影响。
SGA容量是由多个初始化参数决定的。主要参数有:
DB_CACHE_SIZE:标准容量数据块(standard block)使用的缓存区的容量
LOG_BUFFER:重做日志缓冲区(redo log buffer)的容量,以字节(byte)为单位
SHARED_POOL_SIZE:存储共享SQL及PL/SQL的内存容量,以字节为单位
LARGE_POOL_SIZE:大型池(large pool)的容量,默认值为0
JAVA_POOL_SIZE:JAVA池(Java pool)的容量
2、共享全局区自动管理
在oracle 10g中,只需要使用SGA_TARGET参数指定实例可以使用的SGA总量即可,oracle能够自动地将内存分配给SGA的各个子组件,以提高内存使用效率。
注:在10g中,SGA_TARGET参数涵盖了SGA的全部内存,在启动时,如果SGA_TARGET参数的值超过了SGA_MAX_SIZE,后者将会被忽略。
注:SGA_TARGET参数不能动态设置,只能在数据库启动时设置。
3、修改及查询SGA内存组件容量adding granules(粒度) and tracking component size
可以使用ALTER SYSTEM 语句修改初始化参数中的相关值来改变SGA中各组件占用的SGA容量。oracle将用户设定的值向上(增大)修正为与其最接近的16M的倍数,并增加或减少内存组件中的粒度单位(granule),使其容量达到用户设定的要求。我们应该保证系统具备足够的内存以满足内存分配请求。只要当前SGA内存容量小于SGA_MAX_SIZE参数的限制,oracle就能为SGA分配更多的内存。
SGA各个内存组件当前使用的粒度单位的大小可以通过V$SGAINFO视图进行查询。各个内存组件当前容量及最近一次修改变量操作的类型和时间可以通过V$SGA_DYNAMIC_COMPONENTS视图进行查询。oracle还维护着一个先进先出的缓冲区(circular buffer),其中记录了最近400次调整SGA内存组件容量的操作。可以通过V$SGA_RESIZE_OPS视图来查询这个缓冲区。
注:如果为内存组件设置的容量不是粒度单位(granule)的整数倍,oracle会将其向上(增大)修正为与其最接近的粒度单位的整数倍。
三、程序全局区概述overview of the program global areas
程序全局区(program global area PGA)是供服务进程(server process)存储数据及控制信息的内存区域。这是一种在服务进程启动时由oracle创建的非共享的内存区。只有服务进程才能访问属于它的PGA,而对PGA的读写操作是由oracle代码实现的。一个oracle实例中为所有服务进程分配的PGA内存也被称为此实例的合计PGA(aggregated PGA)。
1、PGA的内容
PGA内存中存储的内容依据实例服务进程的模式有所不同。但是通常来说,PGA中包含以下内容
私有SQL区(private SQL area):私有SQL区中包含绑定信息(bind information)及运行时内存结构(runtime memory structure)等数据。每个提交了SQL语句的会话都会有一个私有SQL区。每个提交了相同的SQL语句的用户都有自己的私有SQL区,但它们使用同一个共享SQL区(shared SQL area)。即多个私有SQL区可以和同一个共享SQL区相联系。
2、SQL工作区
对于复杂的查询来说(例如,决策支持系统的查询decision-support queries),运行时区域(run-time area)的大部分容量均供需要占用大量内存的操作创建工作区(work area)只用。这些操作包括:
需要进行排序的操作(order by/group by/rollup/window function)
哈希连接(hash-join)
位图融合(bitmap merge)
位图创建(bitmap create)
用户可以对工作区的容量进行控制与调优。一般来说,更大的工作区能够显著提高SQL操作的性能,但是会消耗更多的内存。最理想的情况是,工作区能够容纳SQL语句的全部输入数据及额外的控制内存结构。否则语句的响应时间将增加,因为部分输入数据必须放入临时磁盘区。在极端情况下,如果工作区容量远小于输入数据,那么输入数据需要在临时磁盘区与工作区间多次交换。这会显著地增加SQL操作的响应时间。
3、专用服务模式下的PGA内存管理PGA memory management for dedicated mode
SQL工作区所占的容量可以被统一地且自动的管理。我们只需要设定PGA_AGGREGATE_TARGET初始化参数就能设定一个oracle实例使用的全部PGA容量。此参数的值针对整个实例,oracle将保证所有数据库服务进程使用的全部PGA内存不超过此参数限制。
设定了PGA_AGGREGATE_TARGET参数后,专用服务模式下创建的全部会话所使用的工作区的容量将会被自动地调整。
oracle提供了固定视图(fixed view)供用户查询PGA内存的统计信息。在设置了PGA_AGGREGATE_TARGET参数后,oracle开始收集关于PGA的统计信息。
与工作区内存分配及相关使用的统计信息可以从以下动态性能视图(dynamic performance view)中查询:V$SYSTAT,V$SESSTAT,V$PGASTAT,V$SQL_WORKAREA,V$WORKAREA_ACTIVE
V$PROCESS视图中的以下三列记录了分配给oracle进程使用的PGA内存的情况:PGA_USED_MEM,PGA_ALLOCATED_MEM,PGA_MAX_MEM
注:专用服务器(dedicated server)与共享服务器(shared server)所分配的工作区都可以采用自动PGA内存管理模式。
四、软件代码区software code areas
软件代码区是用于存储可运行的或正在运行的程序代码的内存空间。oracle系统程序的代码也存储在软件代码区,但其在此区域内的位置与用户程序完全不同,系统程序代码所在的位置更独立,且保护更严密。
软件代码区是只读的。

没有评论:

发表评论