HelloDBA [English]
搜索Internet 搜索 HelloDBABA
  Oracle技术站。email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com   acoug  acoug 

Q&A——多缓冲池

[English]

作者: fuyuncat

来源: www.HelloDBA.com

日期: 2009-07-07 15:01:52

分享到  新浪微博 腾讯微博 人人网 i贴吧 开心网 豆瓣 淘宝 推特 Facebook GMail Blogger Orkut Google Bookmarks

问:

 1. 关于Recycle buffer,在这个缓存区中数据是可以被清出去的,但是,什么条件才会让这里的数据被清理出去呢?

 2.您写的文档说会即清除那些不在使用的数据缓存块.请问一下,在哪个文档上有更详细说明,谢谢您.

 3. keep bufferrecycle buffer也是使用LRU?

 

答:

 

对于你的问题我不一一作答,相信看了以下的解释能帮你理解这些问题。

我们知道,Oraclebuffer cache对数据块的管理是采用LRU算法,即当没有空闲内存可用,需要从已分配的内存块中回收内存时,首先将最近最少被使用的内存块(即从LRU链表的LRU端开始)回收。最新分配到的内存块被放置到LRU链表的MRU端。但是,由于全表扫描读取的数据量很大,如果被放置到MRU端会导致大量内存被占用、且短时间内无法回收,因此全表扫描的数据就直接被放置到了LRU端,这样就保证了全表扫描对于buffer hit的影响最小。

尽管用这种办法降低了全表扫描对buffer hit的影响,但是如果是对一张非常大的表进行扫描,buffe cache会被大量被占用,导致很多数据块都被清除出去,会极大影响系统性能。为了保护这些数据不被大的全表扫描数据所侵略oracle就在SGA中专门开辟了一块区域来分配给这些大的全表扫描使用,使它们不占用正常的buffer cache。这一块专门区域就是recycle buffer。当系统中设置了recycle buffer、且表被指定了NOCACHE时,对该表的全表扫描数据就读入recycle buffer中。对recycle buffer的管理也是采用LRU算法管理的。

recycle buffer解决了大的全表扫描数据对buffer cache的侵占问题。但是,在我们的系统中,还会存在一些这样的表(如一些supporting表、code表),他们的数据量不大、对他们进行全表扫描效率更高,同时他们使用比较频繁。对于这些表,采用之前的我们提到的对全表扫描数据的处理的方法(放到LRU端)就会产生另外一个问题了:这些被频繁使用到的数据内存块很容易被系统回收,导致系统总是从磁盘上读取它们的数据、降低了性能。为了能保证这些数据不被其他数据从内存中踢出,oracle也为它们在SGA中开辟了一块区域专门存放,这块区域就是keep buffer。当系统设置了keep buffer,且表被指定了CACHE时,对该表的全表扫描数据就被读入keep buffer。同样,对keep buffer的管理也是采用lru算法。

   

 

fuyuncat

 

--The end--

Top

Copyright ©2005,HelloDBA.Com 保留一切权利

申明
by fuyuncat