可以看到,当调整了SGA_TARGET参数后,尽管没有去手动调整SGA_MAX_SIZE的值,但现在它自动和修改后的SGA_TARGET的值匹配了,从272M调整为352M,这里还有个比较有意思的地方,就是指定了350M,为何会变为352M,这多出来的2M又是什么呢?
SQL> select 350/4 "Granual Count" from dual;
Granual Count ------------- 87.5
SQL> select 88*4 "SGA_SIZE(MB)" from dual;
SGA_SIZE(MB) ------------ 352
其实很容易理解,刚才说了Granual Size的大小为4M,由于Granual必须完整地分配,因此会分配给SGA共88个Granual,即88*4=352M,也就是多给了2M
再来看一下刚才那些内存组件的内存分配情况
SQL> select name,bytes/1024/1024 "size(MB)",resizeable from v$sgainfo;
NAME size(MB) RES ----------------------------------- ---------- --- Fixed SGA Size 1.16297913 No Redo Buffers 2.8359375 No Buffer Cache Size 252 Yes Shared Pool Size 80 Yes Large Pool Size 4 Yes Java Pool Size 4 Yes Streams Pool Size 8 Yes Granule Size 4 No Maximum SGA Size 352 No Startup overhead in Shared Pool 36 No Free SGA Memory Available 0
11 rows selected.
SQL> select component,current_size/1024/1024 "size(MB)" from v$sga_dynamic_components;
COMPONENT size(MB) ---------------------------------------------------------------- ---------- shared pool 80 large pool 4 java pool 4 streams pool 8 DEFAULT buffer cache 252 KEEP buffer cache 0 RECYCLE buffer cache 0 DEFAULT 2K buffer cache 0 DEFAULT 4K buffer cache 0 DEFAULT 8K buffer cache 0 DEFAULT 16K buffer cache 0 DEFAULT 32K buffer cache 0 ASM Buffer Cache 0
13 rows selected.
SQL>
当我们把SGA_TARGET从272M调整为350M时,由于Gruanual的存在,Oracle实际给SGA分配了352M的内存,而这352M内存中,其他内存组件的大小都没有发生变化,仅仅只是db buffer cache的值由之前的172M调整到了252M
之所以db buffer cache size随着SGA_TARGET的值自动调整,是因为这时10g的新特性,只要SGA_TARGET为非零值,那么内存组件就是采用动态分配原则,由Oracle自动调整各内存组件的大小。不过有个地方挺奇怪的,虽然从启动实例时分配地内存也好,从v$sgainfo以及v$sga_dynamic_components中也好,看到的值都是252M,而从参数看db_cache_size的值,仍然是172M,不知何故,难道是bug
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_advice string ON db_cache_size big integer 172M
刚才是直接修改SGA_TARGET而不修改SGA_MAX_SIZE的情况,我们再来看一下反过来的情况,先把SGA_TARGET调整回272M
SQL> alter system set sga_target=270m scope=spfile;
System altered.
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started.
Total System Global Area 285212672 bytes Fixed Size 1219016 bytes Variable Size 100664888 bytes Database Buffers 180355072 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> show parameter sga
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 272M sga_target big integer 272M
注意,一旦SGA_TARGET动了,重启 数据库后,SGA_MAX_SIZE会跟着调整,也一起回到了272M的状态,但与增大SGA_TARGET时的情况不同,也可以选择不重启数据库,那么SGA_MAX_SIZE的值就不会做调整,而内存组件的值依然会跟着SGA_TARGET走(体现动态调整)
SQL> alter system set sga_target=270m;
System altered.
SQL> show parameter sga
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 352M sga_target big integer 272M
由于是减小SGA_TARGET的值,因此不受必须比TARGET_MAX_SIZE小的这个条件限制,因此数据库无需重启
SQL> select name,bytes/1024/1024 "size(MB)",resizeable from v$sgainfo;
NAME size(MB) RES ----------------------------------- ---------- --- Fixed SGA Size 1.16297913 No Redo Buffers 2.8359375 No Buffer Cach