KEEP
指定KEEP将把数据块放入KEEP缓冲池中。维护一个适当尺寸的KEEP缓冲池可以使Oracle在内存中保留数据库对象而避免I/O操作。在表、聚集、实体化视图或实体化视图日志上,KEEP子句的优先权大于NOCACHE子句。
CACHE | NOCACHE | CACHE READS
使用chche子句可制定oracle在缓冲中如何存储数据块。
在create table语句中,默认为nocache。
alter table语句中,不会改变当前表的cache/nocache的值。
cache子句
对于访问频繁的数据,可指定当执行一个全表扫描时,将从表中获取的数据块放在缓冲中LRU列表的“最新使用”的一端。这个属性对于小表有用。
cache子句不能在index上使用cache,但是index隐式提供了cache的效果。
nocache子句
对应访问不频繁的数据,该子句可以知道之星一个全表扫描时,从表中获取数据块放在缓冲中国LRU列表“最久使用”的一端。
CACHE READS
CACHE READS只适用于LOB存储。它指定当进行读操作时,将LOB放在缓冲中,而写操作时不这样做。
当BUFFER_POOL和CACHE同时使用时,KEEP比NOCACHE有优先权。
BUFFER_POOL用来指定存贮的缓冲池,而CACHE/NOCACHE指定存储的方式。
create/alter table ...... storage(buffer_pool keep);当表被读入的时候,放入keep pool,keep pool 中的数据会尽量长时间的保留,保留的时间长短依据keep pool的负载而定。
create/alter table ...... cache;当全表扫描时,放入default pool 的LRU热端(如无cache,则放入LRU冷端,很快就会被age out),适合频繁使用的小表,如果有很多表要cache,那应该把表放如keep pool.
keep pool只要够大,能容纳你想要keep的数据,那他们就一直在keep pool里,当你想keep一个表,而keep pool已经满了,此时LRU机制才起作用。
全表扫描时,数据是放入default pool的LRU冷端,所以可能很快就会被从内存中age out,对一些频繁使用的小表来说效率就比较底了,所以使用cache 子句,在全表扫描时,让oracle把数据放入LRU的热端,避免很快被age out,如果有太多的表cache,LRU链表会很拥挤,LRU机制也会受影响,所以该把表放入keep pool,而且cache子句也不适合大表,因为有可能这个大表会占据整个LRU链表。
cache clause和buffer pool keep是两个相互独立的属性,即可同时使用,也可以分别使用。
cache子句是指将表的块,放到它将要用到的buffer_pool (缺省为default, 也可以通过buffer_pool子句指定keep,或recycle)的mlu端。这样的效果是它将最慢的从相应的buffer_pool中清洗出去。
指定buffer_pool , 只不过是将buffer分成了三块,每块有自己的mru/lru列表。 但是如果keep pool size设置的比所有需要keep的表的存储空间小,那么在keep pool中最早使用的表还是有可能被清洗出去。
如果对某一个表即做了storage(buffer_pool keep),又做了cache,那么,这表就被放到了keep池的mlr端,它就最慢的从keep池中出去。