在Oracle 10g系统管理中,有一个自动SGA内存管理(ASMM)。下面介绍一下这个功能:
要使用自动管理,需要设置参数SGA_TARGET、STATISTICS_LEVEL(=TYPICAL或ALL,因为不支持统计集合,数据库就没有必要的历史信息来确定大小)。在Oracle9i及以前版本中,只能用手动SGA内存管理,不存在参数SGA_TARGET,而且参数 SGA_MAX_SIZE只是一个上限,而不是动态目标,但10G中时SGA_TARGET设置不能超过它。
在Oracle 10g中,与内存相关的参数可以归为两类:
◆自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE。
◆手动SGA参数:这些参数包括LOG_BUFFER、STREAMS_POOL、DB_NK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
在Oracle 10g中,任何时候你都能查询V$SGAINFO,来查看SGA的哪些组件的大小可以调整。(Oracle 10g系统管理相比之前的版本是大大增强了)
采用自动SGA内存管理时,确定自动调整组件大小的主要参数是SGA_TARGET,这个参数可以在数据库启动并运行时动态调整,最大可以达到SGA_MAX_SIZE参数设置的值(默认等于SGA_TARGET,所以如果想增加SGA_TARGET,就必须在启动数据库实例之前先把SGA_MAX_SIZE设置得大一些)。数据库会使用SGA_TARGET值,再减去其他手动设置组件的大小(如DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE等),并使用计算得到的内存量来设置默认缓冲区池、共享池、大池和Java池的大小。在运行时,实例会根据需要动态地对这4个内存区分配和撤销内存。
随着时间的推移,当实例的内存需求越来越确定时,各个SGA组件的大小也越来越固定。即便数据库关闭后又启动,数据库还能记得组件的大小,因此不必每次都从头再来确定实例的正确大小。这是通过4个带双下划线的参数做到的:__DB_CACHE_SIZE、__JAVA_POOL_SIZE、__LARGE_POOL_SIZE和__SHARED_POOL_SIZE。如果正常或立即关闭数据库,则数据库会把这些值记录到存储参数文件(SPFILE)中,并在启动时再使用这些值来设置各个区的默认大小。
另外,如果知道4个区中某个区的最小值,那么除了设置SGA_TARGET外,还可以设置这个参数。实例会使用你的设置作为下界(即这个区可能的最小大小),但是重要的一点要记住,这样Oracle就不能缩小相应区的大小到设定的最小值以下了。
以上就对Oracle 10g系统管理中的自动SGA内存管理功能进行了简单的介绍。
本文作者:未知