10G r2环境中:
sga主要由sga_target,sga_max_size控制,sga_target设置非0时代表开户SGA自动管理,
需要注意的是,当调整sga_target<sga_max_size时,重启实例后,sga_max_size会自动调整为与sga_target相同的值(11GR2不会)。
当试图增加一个内存的大小,并且如果这个值导致所有内存区大小总和大于SGA_MAX_SIZE时,oracle会提示错误,不允许修改。
当然,如果在设置参数时,指定区域为spfile时(包括修改SGA_MAX_SIZE本身),是不会受到这个限制的。这样就可能出现这样的情况,在spfile中,SGA各个内存区设置大小总和大于SGA_MAX_SIZE。这时,oracle会如下处理:当实例再次启动时,如果发现SGA各个内存总和大于SGA_MAX_SIZE,它会将SGA_MAX_SIZE的值修改为SGA各个内存区总和的值。
10G r2环境中,sga_target为动态参数,可在实例中alter system set sga_target=280M直接修改,但修改时此值不能大于sga_max_size设置的值。不然得首先修改sga_max_size的值,此参数为静态参数,alter system set sga_max_size=280m scope=spfile。
11g环境:
增加了memory_max_size与memory_target参数,当memory_target设置为0时,代表为启用内存管理,此时应该依旧可以设置sga_target与sga_max_size用于控制SGA分配,也正好说明向下兼容。
当memory_target设置非0时,说明SGA自动管理,此时sga_target与sga_max_size应不再作用于数据库。
当设置了sga_target或者设置了memoy_target时,表示SGA是由ORACLE自动管理的时候,此时再手动设置SGA中各组件的值,如果手动设置的值大于ORACLE自动设置的值,则手动设置会生效,如果手动设置的值小于ORACLE自动设置的值,则设置不会生效!
show parameter shared_pool 有时并不能准确反应SGA动态信息,
可查看v$sgainfo或v$sga_dynamic_components
或select component,current_size from v$sga_dynamic_components;
SGA相关视图:
v$sgastat
select sum(bytes)/1024/1024 mbytes from v$sgastat where pool='shared pool';
v$sgainfo(查询可调整的SGA组件)
select name,Bytes/1024/1024 Mbytes,RESIZEABLE from v$sgainfo;
查看buffer cache命中率
select 1-(PHYSICAL_READS)/(CONSISTENT_GETS+DB_BLOCK_GETS) from v$buffer_pool_statistics;