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 pool和PGA的大小动态的调整SGA。如果在参数文件中指定了SGA_MAX_SIZE的值,并且该值小于各个SGA部件的总和,那么这个参数就会被忽略;如果该值大于各个SGA部件的总和,那么SGA可以动态增加的最大值是SGA_MAX_SIZE。
动态SGA分配的最小单元叫做granule,并且Oracle总是以granule的整数倍进行调整。Granule的尺寸由SGA尺寸的大小决定,如果SGA小于128M,granule大小为4M;如果SGA大于128M,granule大小为16M。但是也和操作系统平台有关,如32-bit WinX的平台,如果SGA大小大于128M,granule大小为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_SIZE是4MB,当前shared_pool_size是12MB 现在把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_SIZE是4MB向上取整,即分配的还是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_SIZE是4MB向上取整,即所以实际分配的是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_SIZE是4MB向上取整,即所以实际分配的是8MB。
|
最小的SGA配置是3个granule,一个用于固定SGA(包括redo buffers),一个用于buffer cache,一个用于shared pool。
当实例运行的时候,我们可以通过alter system命令动态修改buffer cache, shared pool和large 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_size,hash_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大小