1、ASMM(Automatic Shared Memory Management,10g)
(1)、原理:
只需指定SGA_TARGET参数(SAG的总大小),数据库将会根据负载和历史信息来自动分配SAG的每个组件。
启用ASSM需将STATISTICS_LEVEL参数设为TYPICAL或ALL,并且SGA_TARGET参数为非0。
(2)、ASSM自动分配以下SGA组件:
SHARED_POOL_SIZE
DB_CACHE_SIZE
LARGE_POOL_SIZE
JAVA_POOL_SIZE
STREAMS_POOL_SIZE
(3)、以下的组件还需要手动来管理:
LOG_BUFFER
RESULT_CACHE_SIZE
DB_KEEP_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
DB_nK_CACHE_SIZE
(4)、手动管理的组件也包括在SAG_TARGET中,比如SGA_TARGET是400M,LOG_BUFFER为1M,DB_KEEP_CACHE_SIZE为50M,那么可供ASSM来自动管理的大小只有349M;
SAG_TARGET参数可以通过ALTER SYSTEM来动态的改变大小,但不能超过SGA_MAX_SIZE参数大小,SGA_MAX_SIZE不是动态可以改变的;
如果DBA调整SGA_TARGET的值,那么会引起被ASMM管理的缓冲区的变化,而不会引起手工管理的缓冲区的变化;
在使用ASMM的情况下,ASMM自动管理的缓冲池可以设置为0,也就是说不设置任何限制,由ASSM完全管理;
如果某个ASMM自动管理的缓冲池设置了非零的值,那么ASMM会保证在任何情况下,这个缓冲池的大小不会小于这个参数设置值;
在数据库运行的过程中,DBA可以动态调整ASMM管理的缓冲池的大小,如果设置的新值大于目前缓冲池的大小,并且是合理的,那么该设置会立即生效;
如果设置的新值小于目前缓冲池的大小,ASMM会记录下这个设置建议,但是不会立即缩小缓冲池,而是会等待今后别的缓冲池需要扩展的时候才会释放;
对于一个使用ASMM的系统,可以随时改变为关闭ASMM,只要将SGA_TARGET设置为0,如果这个操作发生了,那么所有的ASMM管理的参数都会保留为当前的设置;
10G ASMM只能管理DB CACHE中的DEFAULT池,而不能管理所有的DB CACHE。KEEP池、RECYCLE池和NK缓冲池都需要手工管理;
可以通过V$SGA_DYNAMIC_COMPONENTS视图来查看当前SGA组件的大小;
如SGA_TARGET设为0来关闭ASSM,当前各组件的SIZE将会写入SPFILE用来下次的启动。
(5)、开启ASMM
i、Get a value for SGA_TARGET;
SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" FROM DUAL;
ii、Use that value to set SGA_TARGET;
iii、Set the values of the automatically sized SGA components to 0.
(6)、ASMM的另外一个优势是能够把有限的内存资源合理分配,不会因为DBA设置错误而导致部分缓冲区性能下降。一个新的后台进程mman会对系统的缓冲区状态进行分析,根据目前系统的负载情况,根据一定的策略对缓冲区进行调整。其处理过程如下:
首先,周期性采集系统的状态;
生成或分析建议直方图 ;
根据直方图找到合理的缓冲区调整方案;
根据调整方案自动调整各个缓冲区的大小。
(7)、关闭ASMM
i、Setting SGA_TARGET to 0 disables autotuning.
ii、Autotuned parameters are set to their current sizes.
iii、The SGA size as a whole is unaffected.
2、MSMM(9i)
PGA_AGGREGATE_TARGET来实现PGA的自动管理。此参数用来指定所有session总计可以使用最大PGA内存。
SQL> show parameter WORKAREA_SIZE_POLICY;
此参数用于开关PGA内存自动管理功能,该参数有两个选项:AUTO 和 MANUAL,当设置为AUTO时,数据库使用Oracle9i提供的自动PGA管理功能,当设置为MANUAL时,则仍然使用Oracle9i前手工管理的方式。
3、AMM(Automatic Memory Management,11g)
在ASMM的基础上加强对PGA的自动化管理;
MEMORY_TARGET:动态控制SGA和PGA时,Oracle总共可以使用的共享内存大小,这个参数是动态的,因此提供给Oracle的内存总量是可以动态增大,也可以动态减小的。它不能超过MEMORY_MAX_TARGET参数设置的大小,默认值是0;
MEMORY_MAX_TARGET:这个参数定义了MEMORY_TARGET最大可以达到而不用重启实例的值,如果没有设置MEMORY_MAX_TARGET值,默认等于MEMORY_TARGET的值;
使用动态内存管理时,SGA_TARGET和PGA_AGGREGATE_TARGET代表它们各自内存区域的最小设置,要让Oracle完全控制内存管理,这两个参数应该设置为0。