数据库高速缓冲区(Database buffer cache)

数据库高速缓冲区是存放数据的共享内存,Oracle通过LRU算法管理。文章介绍了如何调整其大小,8i之前通过db_block_buffers,9i后用DB_CACHE_SIZE。此外,Oracle提供了default、keep、recycle三种类型的buffer cache,便于管理不同访问频率的对象。9i以后引入了自动内存管理,简化了设置。文章还讨论了不同版本下buffer cache的设置优化,以及如何根据v$db_cache_advice进行调整建议。最后,文章分析了buffer cache的统计信息和优化方法,包括计算命中率和处理热点数据块问题。
摘要由CSDN通过智能技术生成

 数据库高速缓冲区是临时存放数据的共享内存。使用以下两个角色说明:用户角色和oracle角色

用户:用户提交select * from emp请求,oracle如何提取数据库中的数据?

oracle响应客户提取数据的策略:首先查看Database buffer cache中有没有select * from emp查询过的数据,如果有刚直接从Databse buffer cache中读取返回给客户;如果没有则直接操作硬盘,把数据读写到Database buffer cache中,再返回给客户。

 

oracle 如果管理database buffer cache读取到的这些数据:使用LRU(least recently used)的队列或者算法(algorithem)

 

如何调整database buffer cache 的大小:8i之前,大小由db_block_size和db_block_buffers乘积表示。db_block_size只能创建数据库是指定大小,要使用它调整大小,必须重新创建数据库,所以考虑由db_block_buffers来调整大小,有一点是db_block_buffers调整大小要重启数据库。9i之后的版本中,引进了动态表示,database buffer cache 的大小由DB_CACHE_SIZE指定。8i和9i之后的版本表示大小在这的区别是:db_block_size和db_block_buffers乘积表示buffer cache的数量,而DB_CACHE_SIZE表示容量

 

动态调整数据库高速缓冲区大小的语句:Alter system set db_cache_size=48M

以下是对buffer cache的优化说明

4. buffer cache的优化

4.1 buffer cache的设置优化

   buffer cache的设置随着Oracle版本的升级而不断变化。8i下使用db_block_buffers来设置,该参数表示buffer cache中所能够包含的内存数据块的个数;9i以后使用db_cache_size来设置,该参数表示buffer cache的总共的容量,可以用字节、K、M为单位来进行设置。而到了10g以后则更加简单,甚至可以不用去单独设置buffer cache的大小。因为10g引入了ASMM(Automatic Shared Memory Management)这样一个可以进行自我调整的组件,该组件可以自动调整shared pool size、db cache size等SGA中的组件。只需要设置sga_target参数,则其他组件就能够根据系统的负载和历史信息自动的调整各个部分的大小。要启动ASMM,只需要设置statistics_level为typical或all。

   oracle8.0以前只能设置一种buffer cache,而从8.0以后,oracle提供了三种类型的buffer cache,分别是default、keep、recyle。keep和recycle是可选的,default必须存在。8i以前使用db_block_buffer设置default、buffer_pool_keep设置keep、buffer_pool_recycle设置recyle。而8i以后使用db_cache_size设置default、db_keep_cache_size设置keep、db_recycle_cache_size设置recycle。10g不能自动设置db_keep_cache_size和db_recycle_cache_size,必须手工设置。
同时,8i以前,这三种buffer cache是独立指定的,互不制约。而8i以后,这三种buffer cache是有相互制约关系的。假如指定了keep和recycle的buffer cache,则default类型的buffer cache的大小就是db_cache_size - buffer_pool_keep - buffer_pool_recycle。

    通常将经常访问的对象放入keep类型的buffer cache里,而将不常访问的大表放入recycle类型的buffer cache里。其他没有指定buffer cache类型的对象都将进入default类型的buffer cache里。为对象指定buffer cache类型的方法如下: SQL> create table test (n number) storage (buffer_pool keep); SQL> alter table test storage (buffer_pool recycle);

  假如没有指定buffer_pool短语,则表示该对象进入default类型的buffer cache。

  这里要说明的是,从名字上看,很轻易让人误以为这三种buffer cache提供了三种不同的治理内存数据块的机制。但事实上,它们之间在治理和内部机制上没有任何的区别。它们仅仅是为DBA们提供了一个选择,就是能够将数据库对象分成“非常热的”、“比较热的”和“不热的”这三种类型。因为数据库中总会存在一些“非常热”的对象,它们频繁的被访问。而假如某个时候系统偶然做了一次大表的全表扫描,就有可能将这些对象清除出内存。为了防止这种情况的发生,我们可以设置keep类型的buffer cache,并将这种对象都移入keep buffer cache中。同样的,数据库中也总会有一些很大的表,可能天天为了生成一张报表,而只需要访问一次就可以了。但有可能就是这么一次访问,就将大部分的内存数据块清除出了buffer cache。为了避免这种情况的发生,可以设置recycle类型的buffer cache,并将这种偶然访问的大表移入recycle buffer cache。

  毫无疑问,假如你要设置这三种类型的buffer cache,你需要自己研究并等于你的数据库中的对象进行分类,并计算这些对象的大小,从而才能够正确的把它们放入不同的buffer cache。但是,不管怎么说,设置这三种类型的buffer cache只能算是最低层次的优化,也就是说在你没有任何办法的情况下,可以考虑设置他们。但是假如你能够优化某条buffer gets非常高SQL使其buffer gets降低50%的话,就已经比设置多个buffer cache要好很多了。

    9i以后还提供了可以设置多种数据块尺寸(2、4、8、16 或 32k)的buffer cache,以便存放不同数据块尺寸的表空间中的对象。使用初始化参数:db_Nk_cache_size来指定不同数据块尺寸的buffer cache,这里的N就是2、4、8、16 或 32。创建数据库时,使用初始化参数:db_block_size所指定缺省的数据块尺寸用于system表空间。然后可以指定最多4个不同数据块尺寸的表空间,每种数据块尺寸的表空间必须对应一种不同尺寸的buffer cache,否则不能创建不同数据块尺寸的表空间。 SQL> create tablespace tbs_test_16k  2 datafile 'C:\oracle\oradata\ora92\tbs_test_16k.dbf' size 10M  3 blocksize 16k; create tablespace tbs_test_16k * ERROR 位于第 1 行: ORA-29339: 表空间块大小 16384 与配置的块大小不匹配 SQL> show parameter db_16k_cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_16k_cache_size big integer 0


  我们可以看到,由于16k数据块所对应的buffer cache没有指定,所以创建16k数据块的表空间会失
败。于是我们先设置db_16k_cache_size,然后再试着创建16k数据块的表空间。 SQL> alter system set db_16k_cache_size=10M; 系统已更改。 SQL> create tablespace tbs_test_16k  2 datafile 'C:\oracle\oradata\ora92\tbs_test_16k.dbf' size 10M  3 blocksize 16k; 表空间已创建。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值