Oracle 9i 动态SGA

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 

Oracle 9i数据库实例的SGA区主要由以下部分构成:

·          Database buffer cache                 

·          Redo log buffer                       

·          Shared pool                           

·          Java pool                             

·          Large pool (optional)                  

·          Data dictionary cache                 

·          Other miscellaneous information       

 

Oracle 在启动的时候指定SGA使用多少虚拟内存,并且在运行时允许实例通过调整buffer cache shared pool large poolPGA的大小动态的调整SGA。如果在参数文件中指定了SGA_MAX_SIZE的值,并且该值小于各个SGA部件的总和,那么这个参数就会被忽略;如果该值大于各个SGA部件的总和,那么SGA可以动态增加的最大值是SGA_MAX_SIZE

 

动态SGA分配的最小单元叫做granule,并且Oracle总是以granule的整数倍进行调整。Granule的尺寸由SGA尺寸的大小决定,如果SGA小于128Mgranule大小为4M;如果SGA大于128Mgranule大小为16M。但是也和操作系统平台有关,如32-bit WinX的平台,如果SGA大小大于128Mgranule大小为8M

如果通过alter system命令改变SGA大小时,如果指定的尺寸不是granule的整数倍,则分配原则是根据指定的值向上取整(round)。动态SGA的所有组成部分使用相同尺寸的granule。每个动态SGA部件的信息可以通过V$SGA_DYNAMIC_COMPONENTS查看:

 

先看一下初始的GRANULE_SIZE和当前shared_pool_size的大小:

 

SQL> select COMPONENT,CURRENT_SIZE,

  2  GRANULE_SIZE

  3  from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE  GRANULE_SIZE

--------------------             ------------       ------------

shared pool                12582912         4194304

large pool                  8388608         4194304

buffer cache               25165824         4194304

 

可见此时GRANULE_SIZE4MB,当前shared_pool_size12MB

现在把shared_pool_size设置为10MB,再看看shared_pool_size的实际变化:

SQL> alter system set shared_pool_size=10M;

 

系统已更改。

 

SQL> select COMPONENT,CURRENT_SIZE,

  2  GRANULE_SIZE

  3  from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE GRANULE_SIZE

-------------------- ------------ ------------

shared pool              12582912      4194304

large pool                8388608      4194304

buffer cache             25165824      4194304

 

可见当前shared_pool_size还是12MB,并不是指定的10MB。这是因为10MB根据GRANULE_SIZE4MB向上取整,即分配的还是12MB

 

现在把shared_pool_size设置为3MB,再看看shared_pool_size的实际变化:

 

SQL>  alter system set shared_pool_size=3M;

 

系统已更改。

 

SQL>  select COMPONENT,CURRENT_SIZE,

  2   GRANULE_SIZE

  3   from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE GRANULE_SIZE

-------------------- ------------ ------------

shared pool               4194304      4194304

large pool                8388608      4194304

buffer cache             25165824      4194304

 

当前shared_pool_size已经改变为4MB,并不是指定的3MB。这是因为3MB根据GRANULE_SIZE4MB向上取整,即所以实际分配的是4MB

 

现在把shared_pool_size设置为5MB,再看看shared_pool_size的实际变化:

 

SQL> alter system set shared_pool_size=5M;

 

系统已更改。

 

SQL>  select COMPONENT,CURRENT_SIZE,

  2   GRANULE_SIZE

  3   from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE GRANULE_SIZE

-------------------- ------------ ------------

shared pool               8388608      4194304

large pool                8388608      4194304

buffer cache             25165824      4194304

 

SQL>

当前shared_pool_size已经改变为8MB,并不是指定的5MB。这是因为5MB根据GRANULE_SIZE4MB向上取整,即所以实际分配的是8MB

 

 

最小的SGA配置是3granule,一个用于固定SGA(包括redo buffers),一个用于buffer cache,一个用于shared pool

当实例运行的时候,我们可以通过alter system命令动态修改buffer cache shared poollarge pool内存区域的尺寸:

SQL> select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE,GRANULE_SIZE

  2  from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE   MIN_SIZE   MAX_SIZE GRANULE_SIZE

-------------------- ------------ ---------- ---------- ------------

shared pool               8388608    8388608    8388608      4194304

large pool                8388608    8388608    8388608      4194304

buffer cache             25165824   25165824   25165824      4194304

 

SQL> ALTER SYSTEM SET SHARED_POOL_SIZE=4M SCOPE=Memory;

 

系统已更改。

 

SQL>  select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE,GRANULE_SIZE

  2   from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE   MIN_SIZE   MAX_SIZE GRANULE_SIZE

-------------------- ------------ ---------- ---------- ------------

shared pool               4194304    4194304    8388608      4194304

large pool                8388608    8388608    8388608      4194304

buffer cache             25165824   25165824   25165824      4194304

 

SQL> ALTER SYSTEM SET DB_CACHE_SIZE=25M SCOPE=Memory;

 

系统已更改。

 

SQL>  select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE,GRANULE_SIZE

  2   from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE   MIN_SIZE   MAX_SIZE GRANULE_SIZE

-------------------- ------------ ---------- ---------- ------------

shared pool               4194304    4194304    8388608      4194304

large pool                8388608    8388608    8388608      4194304

buffer cache             29360128   25165824   29360128      4194304

 

SQL> ALTER SYSTEM SET LARGE_POOL_SIZE=4M SCOPE=Memory;

 

系统已更改。

 

SQL> SHOW PARAMETER LARGE_POOL_SIZE

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- -----------------------------

large_pool_size                      big integer 4194304

SQL>  select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE,GRANULE_SIZE

  2   from V$SGA_DYNAMIC_COMPONENTS;

 

COMPONENT            CURRENT_SIZE   MIN_SIZE   MAX_SIZE GRANULE_SIZE

-------------------- ------------ ---------- ---------- ------------

shared pool               4194304    4194304    8388608      4194304

large pool                4194304    4194304    8388608      4194304

buffer cache             29360128   25165824   29360128      4194304

 

SQL>

 

 

另外,在Oracle 9i中,高速缓冲池的参数有一些变化:

·          DB_CACHE_SIZE参数代替了以前版本数据库的 DB_BLOCK_BUFFERS参数,并且DB_CACHE_SIZE参数是以字节为单位的(DB_BLOCK_BUFFERS参数是以块数为单位的),该参数指定了高速缓冲区中的默认池(DEFAULT)的大小;

·          DB_KEEP_CACHE_SIZE参数代替了BUFFER_POOL_KEEP参数,可以将频繁使用的小表指定在该缓冲区;

·          DB_RECYCLE_POOL_SIZE参数代替了BUFFER_POOL_RECYCLE参数,可以将希望快速移出内存的大表放在这个区域;

 

当不设置DB_KEEP_CACHE_SIZE参数和DB_RECYCLE_POOL_SIZE参数,高速缓冲池中将只有默认的区域,即DB_CACHE_SIZE参数指定的区域:

SQL> select NAME, BLOCK_SIZE from V$BUFFER_POOL_STATISTICS

  2  /

 

NAME                 BLOCK_SIZE

-------------------- ----------

DEFAULT                    8192

 

SQL>

 

 

Oracle 9i PGA 被逻辑地分成两个部分:

·          可调整区域,即SQL工作区,等等

·          不可调整区域,比如说sort area等等

为了调整PGA,我们需要介绍两个新的参数:WORKAREA_SIZE_POLICY PGA_AGGREGATE_TARGET

WORKAREA_SIZE_POLICY的值可以是AUTO 或者 MANUAL,该参数意味着是使用以前的方法管理PGA的使用(如,sort_area_sizehash_area_size等等),还是使用新的方法来管理PGA的使用。如果没有设置参数PGA_AGGREGATE_TARGET,则WORKAREA_SIZE_POLICY的缺省值是MANUAL

PGA_AGGREGATE_TARGET参数意味着可以划分到SGA中的最大的数量的内存,它包括所有session的可调整和不可调整的部分,这个参数没有缺省值,当我们将WORKAREA_SIZE_POLICY 设置为 AUTO之前,必须先设置PGA_AGGREGATE_TARGET参数。

 

我们可以通过下面的方式查看PGA的使用:

SQL> SELECT SUM(PGA_USED_MEM), SUM(PGA_ALLOC_MEM), SUM(PGA_MAX_MEM)

  2  FROM V$PROCESS;

 

SUM(PGA_USED_MEM) SUM(PGA_ALLOC_MEM) SUM(PGA_MAX_MEM)

----------------- ------------------ ----------------

         14569292           28619756         28619756

 

SQL>

 

其中:

·          PGA_USED_MEM:该进程当前使用的PGA大小;

·          PGA_ALLOC_MEM:当前分配给该进程的总的PGA大小;

·          PGA_MAX_MEM:曾经分配给该进程的最大的PGA大小

 

 

 

 

 

 

 

阅读更多
个人分类: oracle
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭