Oracle性能优化 之 共享池(二)

2014-11-24 09:43:14 · 作者: · 浏览: 1
T大小后,如果Oracle自动定义的共享池大小不合适怎么办,有很多时候我们不能完全依赖软件的智能,显然Oracle公司也清楚的明白这一点,因此,它还是保留了一些让DBA手动调整共享池等SGA内存 组件的权利,10G下的调整比9i理解起来稍微复杂一点,下面我们说一下10g下共享池的调整注意事项。

在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)已