ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Buffer Cache Size(数据缓冲区)

Buffer Cache Size(数据缓冲区)

原创 Linux操作系统 作者:pingley 时间:2012-02-06 20:51:45 0 删除 编辑
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的非标准数据块表空间。
注意:必须先设置数据缓冲区中相应的非标准数据块的缓冲区大小,才能创建相应的非
标准数据块表空间。否则会报错。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26110315/viewspace-715720/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    847538