[English]
作者:
fuyuncat
来源:
www.HelloDBA.com
问:
1. 关于Recycle buffer,在这个缓存区中数据是可以被清出去的,但是,什么条件才会让这里的数据被清理出去呢?
2.您写的文档说会即清除那些不在使用的数据缓存块.请问一下,在哪个文档上有更详细说明,谢谢您.
3. keep buffer和recycle buffer也是使用LRU吗?
答:
对于你的问题我不一一作答,相信看了以下的解释能帮你理解这些问题。
我们知道,Oracle的buffer 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--