共享池、大池、Java池、高速缓存的内存通过设置分配单元作为基本单元分配。在SGA小于1GB的情况下,分配单元尺寸为
4MB,当SGA大于1GB时,单元尺寸为16MB。该单元大小能通过视图 V$SGA_DYNAMIC_COMPONENTS查询。这个单元决定了在SGA中所有
动态分配区域的组成状态。例如下面查询了系统中SGA当前分配的尺寸和单元大小:
SQL>select COMPONENT,CURRENT_SIZE,GRANULE_SIZE from V$SGA_DYNAMIC_COMPONENTS;
SQL> run
1* select COMPONENT,CURRENT_SIZE,GRANULE_SIZE from V$SGA_DYNAMIC_COMPONENTS
COMPONENT CURRENT_SIZE GRANULE_SIZE
-------------------- ------------ ------------
shared pool 67108864 4194304
large pool 4194304 4194304
java pool 4194304 4194304
streams pool 0 4194304
DEFAULT buffer cache 205520896 4194304
KEEP buffer cache 0 4194304
RECYCLE buffer cache 0 4194304
DEFAULT 2K buffer ca 0 4194304
che
DEFAULT 4K buffer ca 0 4194304
COMPONENT CURRENT_SIZE GRANULE_SIZE
-------------------- ------------ ------------
che
DEFAULT 8K buffer ca 0 4194304
che
DEFAULT 16K buffer c 0 4194304
ache
DEFAULT 32K buffer c 0 4194304
ache
COMPONENT CURRENT_SIZE GRANULE_SIZE
-------------------- ------------ ------------
ASM Buffer Cache 0 4194304
13 rows selected.
SQL>
|||||||||||||||||||||||||||
保留池和循环池
显然,最常用的数据应该长期保留在内存结构中。保留池的作用就是长期存放某些“热”的数据块,也就是说,你应该想办法找出你的系统中那些“热”的表,并将其绑定在保留池中。
系统参数DB_KEEP_CACHE_SIZE定义了保留池的空间大小,其数据块尺寸为本系统标准的数据块尺寸。应该注意的是,保留池并不是
默认池的一个子集。因此配置时要注意其大小不应超出操作系统可以提供的容量。
当遇到一个工程上的难题:业务数据库系统中有成百上千张表,还有成千上万个索引,究竟哪些表或索引应该放入保留池呢?
遴选规则如下:
该表中数据并不是很大
该表在SQL操作中被频繁调用
该表往往是数据库实体关系图中的中间表或参照表
和保留池的意义敲好相反,一些鲜有SQL操作的大表,其数据块并无必要长期保留在数据缓存中。
这时,我们可以通过设置循环池,将这些对象放入循环池。
循环池通过初始化参数DB_RECYBLE_CACHE_SIZE指定。同样地,循环池不是默认池的一个子集。下面的命令设置DB_KEEP_CACHE_SIZE初始化
参数,将保留池尺寸定位120MB:
SQL>alter system set db_keep_cache_size=120M scope=both;
|||||