在10g中还是要用Shared_pool_size参数调整共享池,但它已经不再是共享池大小的决定因素。在10g中它只决定了共享池最小有多大,也就是它是共享大小的下限。如果你将它设置为1G,那么 Oracle绝不会分配低于1G内存的共享池。它可能正好按你的要求分配1G,也可能分配多于1G内存的共享池。通常,如果你使用此参数将共享池设置的比以前更大,那么这个设置将会马上生效。而如果你发现共享池有些大了,应该设置的更小些才合适,你用此参数将共享池设置的小了一些,那么这个设置将不会马上生效。为什么呢?因为此参数只是共享池大小的下限。你的共享池本来有1.5G,你将此参数设为了1G,Oracle会认为你只是想让共享池最小不要低于1G,那么当前共享池的大小1.5G满足你的要求,因此,Oracle不会调低共享池大小。什时候它自己也认为1.5G太大了,应该小一些,这时它才会将共享池调小。也就是说在10G中,Oracle加强了自身对共享池的掌控权,只保留给DBA设置下限的权力。
我们可以通过一个视图V$SGA_DYNAMIC_COMPONENTS来了解SGA中各内存组件的大小:
步骤1:我先手动将shared_pool_size参数值设为50M:
SQL> alter system set shared_pool_size=50m;
系统已更改。
步骤2:显示V$SGA_DYNAMIC_COMPONENTS视图:
SQL> SELECT COMPONENT,CURRENT_SIZE,MIN_SIZE,USER_SPECIFIED_SIZE from V$SGA_DYNAMIC_COMPONENTS;
COMPONENT CURRENT_SIZE MIN_SIZE USER_SPECIFIED_SIZE
------------------------------ ------------ ---------- -------------------
shared pool 92274688 92274688 54525952
large pool 8388608 8388608 8388608
java pool 4194304 4194304 0
streams pool 0 0 0
DEFAULT buffer cache 247463936 243269632 209715200
KEEP buffer cache 0 0 0
RECYCLE buffer cache 0 0 0
DEFAULT 2K buffer cache 0 0 0
DEFAULT 4K buffer cache 8388608 8388608 8388608
DEFAULT 8K buffer cache 0 0 0
DEFAULT 16K buffer cache 0 0 0
COMPONENT CURRENT_SIZE MIN_SIZE USER_SPECIFIED_SIZE
------------------------------ ------------ ---------- -------------------
DEFAULT 32K buffer cache 0 0 0
ASM Buffer Cache 0 0 209715200
已选择13行。
这些列的意义我们简单介绍如下:
COMPONENT:SGA中内存组件的名称
CURRENT_SIZE:当前所占用内存大小
MIN_SIZE:通过分析资料,Oracle认为的该内存组件的最小大小
USER_SPECIFIED_SIZE:用户指定的大小。也就是DBA通过设置Shared_pool_size这些参数设置的大小。
上面是我在将shared_pool_size定为50M后的显示结果,从上面的结果可以看出来,USER_SPECIFIED_SIZE为52MB,因为内存是按块分配的,在10g中是4MB一个块,52M正好是13个内存块,Oracle没办法分配50M,因为50不能被4整除。从MIN_SIZE列可以看出,Oracle认为88M的共享池应该最小的共享池大小,因此CURRENT_SIZE列中记录的当前大小就是88MB。
步骤3:继续实验,如果我调高共享池内存会怎样呢:
SQL> alter system set shared_pool_size=100m;
系统已更改。
将共享池内存设为100MB
步骤4:显示结果
SQL> SELECT COMPONENT,CURRENT_SIZE,MIN_SIZE,USER_SPECIFIED_SIZE from V$SGA_DYNAMIC_COMPONENTS where COMPONENT='shared pool';
COMPONENT CURRENT_SIZE MIN_SIZE USER_SPECIFIED_SIZE
------------------------------ ------------ ---------- -------------------
shared pool 104857600 92274688 104857600
这一次我只显示共享池,可以看到用户指定大小(USER_SPECIFIED_SIZE)已