Buffer Cache Size(数据缓冲区)
数据库缓冲区用作oracle执行sql语句的工作区。Sql需要查询或者操作的数据
先从磁盘块中读取到缓冲区。缓冲区中的数据将会保留一段时间,这样可以减
少IO操作。提高性能。数据库缓冲区对于数据库的性能很重要。一般要设置的
大一些以便缓存经常访问的数据块。减少IO操作。但不能大到让操作系统使用
虚拟内存。另外数据库缓冲区过大可能会导致实例启动缓慢,因为要格式化大
量的缓冲区。该区的大小与运用程序类型相关。
数据缓冲区的管理方式:
oracle维护了两张列表用来维护数据缓冲区中的数据块:
写入列表(write list):用来维护脏缓存块(dirty block),指那些发生了
修改但是还没有写入数据文件中的数据。
最近最少使用列表(least recently used,LRU):用来维护空闲的缓存块
(free buffers)、命中缓存块(pinned buffer),以及那些还没有来的及
移动到写入列表的脏数据块。
那些没有被经常访问的数据存放在LRU的尾部,那些经常被访问的数据保存在
LRU的头部,头部也称为MRU(most recently used),随着那些被频繁访问的
数据不断的移动到MRU端,相对访问频段比较低的数据被移动到LRU的尾部。
如果会话要访问的数据不在数据缓冲区中,oracle就需要从数据文件中读入
那些需要被访问的块。在这之前,必须先查找数据缓冲区中的空闲空间,(从
LRU端开始寻找)找到,在查找过程中如果遇到脏数据,oracle会把脏数据移动
到写入列表,如果寻找到合适的空闲空间oracle将从数据文件中读入想要的数据
块放在该空闲空间。读入的数据被放置在LRU列表的某个位置,如果搜索了一定的
数据缓冲空间,还没有找到合适的空间,oracle将会启动DBWR将写入列表中的脏数
据写入磁盘数据文件中。清理出的空闲空间被放置在LRU列表中,oracle会再次寻找
空闲,以找到合适的空闲缓冲块。
足够放下被访问的数据的空间。
oracle中的数据缓冲区是比较复杂的内存结构:
默认池(default pool):在默认情况下数据文件读取的数据就存储在该区。
对于的初始化参数为:db_cache_size,一般情况下设置默认池就可以满足需求。
SQL> show parameter db_cache_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 160M
保持池(keep pool):用于存储那些频繁访问但是不是最热的数据块。对于的初
始化参数为buffer_pool_keep
SQL> show parameter buffer_pool_keep;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_keep string
该数据库尚未使用keep pool
回收池(recycle pool):用于存储那些不希望长期保存在数据缓冲区的数据,尽快的换出
缓存区。对于初始化参数:buffer_pool_recycle.
SQL> show parameter buffer_pool_recycle;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle string
该数据库尚未使用recycle pool。
对象被加载到哪一个缓冲池是由对象的存储类型决定的。可以通过storage子句指定存储
参数,指定对象加载的缓冲池类型。
SQL> create table test_table(id char(5)) storage (buffer_pool keep);
Table created
SQL> alter table test_table storage (buffer_pool recycle);
Table altered
如果不指定buffer_pool 参数默认对象加载的时候是存储在default池中的。
SQL> alter system set db_keep_cache_size=8m;
System altered
设置keep pool为8mb,设置参数为db_keep_cache_size
SQL> alter system set db_recycle_cache_size=8m;
System altered
设置recycle pool为8mb,设置参数为db_recycle_cache_size
SQL> select component,current_size
2 from V$sga_dynamic_components;
COMPONENT CURRENT_SIZE
---------------------------------------------------------------- ------------
shared pool 188743680
large pool 62914560
java pool 54525952
streams pool 0
DEFAULT buffer cache 167772160
KEEP buffer cache 8388608
RECYCLE buffer cache 8388608
DEFAULT 2K buffer cache 0
DEFAULT 4K buffer cache 0
DEFAULT 8K buffer cache 0
DEFAULT 16K buffer cache 0
DEFAULT 32K buffer cache 0
Shared IO Pool 0
ASM Buffer Cache 0
查看设置结果
oracle的缓冲区结构是为了把适当的对象存储在适当的池中。这是对缓冲区
功能的一种细分。缓冲区中的各个子区之间的内存是不能够共享的,例如分
配给默认池的内存只能默认池使用。其他池亦然如此。并且各自子池要设置
合理,以便池中的内存空间足够大,能够缓存需要加载的对象一般情况下不
需要对缓冲区进行如此的细分,仅设置默认池就可以满足需求了。
从oracle9i开始支持非标准数据库,oracle9i以前数据库中所以的数据块大小是相同的
由参数db_block_size确定。oracle9i开始允许在创建表空间的时候指定非标准数据块
以便灵活的存储和管理数据。
相应的数据缓冲区中要有相应的地方存放这些非标准的块。default池,keep池,recycle池
都只能存储默认的标准数据块。在oracle中通过以下参数设置不同块大小的使用的缓冲区:
db_2k_cache_size:为2kb的数据块指定缓冲区大小
db_4k_cache_size:为4kb的数据块指定缓冲区大小
db_8k_cache_size:为8kb的数据块指定缓冲区大小
db_16k_cache_size:为16kb的数据块指定缓冲区大小
db_32k_cache_size:为32kb的数据块指定缓冲区大小
和db_block_size大小相同的数据库参数不需要设置。
SQL> show parameter db_block_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
查看该数据标准块大小
SQL> alter system set db_16k_cache_size=12m;
System altered
为16kb的数据块指定缓冲区大小
SQL> select component,current_size
2 from v$sga_dynamic_components;
COMPONENT CURRENT_SIZE
---------------------------------------------------------------- ------------
shared pool 188743680
large pool 62914560
java pool 54525952
streams pool 0
DEFAULT buffer cache 167772160
KEEP buffer cache 8388608
RECYCLE buffer cache 8388608
DEFAULT 2K buffer cache 0
DEFAULT 4K buffer cache 0
DEFAULT 8K buffer cache 0
DEFAULT 16K buffer cache 12582912
DEFAULT 32K buffer cache 0
Shared IO Pool 0
ASM Buffer Cache 0
确定设置结果。
SQL> create tablespace test datafile 'e:\oracle\testing.dbf' size 10m
2 blocksize 16k;
Tablespace create
创建16kb的非标准数据块表空间。
注意:必须先设置数据缓冲区中相应的非标准数据块的缓冲区大小,才能创建相应的非
标准数据块表空间。否则会报错。