sga自动共享内存管理
sga以一定大小为单位来为各个部分分配内存空间,这个单位被称为细粒,如果sga不大于1G,那么细粒的单位就是4MB,如果大于1G,数值就可能变化了。
相应的可以在v$sga_dynamic_components中的granule_size中查到具体的数值,也可以尝试手动修改一下sga_max_size的数值,再次查看v$sga_dynamic_components
select granule_size from v$sga_dynamic_components
实际试验sga中内存的分配是否以granule细粒为单位的
手动修改下shared_pool_size的大小
alter system set shared_pool_size=30M;
此时shared_pool_size是30M,并不是4M的倍数,我们查看sga的实际分配视图
select name,bytes/1024/1024 MB from v$sgainfo
name Mb
shared pool size 32
实际分配的内存为32M,当然还有别的sga中区的实际分配值,以及字段resizeable表示是否可以改变这些sga中各个部分的大小
手工管理那就是我们需要自己手动来设置shared_pool_size ,buffer_cache_size,java_pool_size,larger_pool_size,streams_pool_size的大小,由于业务流量是边变化的
如果由dba来设置可能满足不了系统的要求,10G后就推出了sga的自动管理,我们需要设置sga_target参数希望sga自动管理规划上面的这些部分的大小,并根据实际的业务量变化。
sga_max_size参数是sga的最大大小,由于是静态初始化参数修改必须重启数据库才能生效,如果没有设置此参数sga_max_size将等于各个组件大小的总和也就是sga_target参数的大小。
但是如果sga_max_size参数太小,无法满足sga的各组件分配的大小,oracle会忽略此参数
alter system set sga_ma_size=10M scope=spfile
startup force
show parameter sga
sga_target 1G
sga_max_size 1G
此时sga_max_size参数默认等于sga_target的参数
需要自动管理sga首先需要设置sga_target为非0参数,指定sga的实际分配内存值,但是此数据不能大于sga_ma_size参数。
alter system set sga_target=2G
指定的sga_target的值大于sga_max_size
如果减小sga_target的数值,并处于压缩sga的大小的值了
alter system set sga_target=1M
无法将sga_target压缩到指定值
此时可以分析oracle是预先按照sga_target的数值来分配各个组件的实际大小,手工修改时oracle都会扩展或者收缩sga的组件大小来达到sga_target的值,但是扩展不能超过sga_max_size,收缩也不能低于sga能收缩的最小值。
还可以参考oracle的内部数据字典v$sga_target_advice中获取oracle的参考信息来设置sga_target,但是此视图个人没有过多分析,所以不好做评论。
shared_pool_size ,buffer_cache_size,java_pool_size,larger_pool_size,streams_pool_size这么参数的值了,这些参数经过实际查资料以及试验是这些组件的分配的预先最小值,就是说实际中他们的数值是大于等于上述这些参数的值。
设置sga自动管理还需要把statistics_level设置为typical(默认值)或者all
如果想让oracle内部自动管理sga组件,可以直接把shared_pool_size ,buffer_cache_size,java_pool_size,larger_pool_size,streams_pool_size全部设置为0,此时没有分配的最小值,oracle会自己根据业务来调节各组件的大小
自动共享内存管理,共享池往往不会被缩小。
alter system set shared_pool_size=500M --设置最小shared_pool_size的分配值
alter system set sga_target=0 --手工管理sga,此时shared_pool_size为上述分配值
alter system set sga_target=500M --开启自动sga管理,sga_target的值不是很大,此时按理说shared_pool_size应该减小来满足别的组大小
show parameter sga
sga_target 808M
此时shared pool并没有缩小,而是sga_target会自动增加到一个需要的值。
某些UNIX平台不支持动态共享内存,SGA占用的物理内存等于SGA_MAX_SIZE指定的值,因此在这样的平台上设定SGA_TARGET(可以动态调整)小于SGA_MAX_SIZE没有实际意义,也就没必要设定SGA_MAX_SIZE了。相反,在另外一些平台如Solaris和Windows上,SGA占用的物理内存等于SGA_TARGET的设定值。
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1053599/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25362835/viewspace-1053599/