CACHE & NOCACHE
语法如下: create/alter table ...... cache;
使用CACHE子句可制定Oracle在缓冲中如何存贮数据块。如果没有指定CACHE或NOCACHE:在CREATE TABLE语句中,默认为NOCACHE。在ALTER TABLE语句中,不会改变当前表的CACHE/NOCACHE值。
CACHE子句 ——对于那些访问频繁的数据,这个子句可以指定当执行一个全表扫描时,将从表中获取的数据块放在缓冲中LRU列表的“最新使用”的一端。这个属性对小的查找表有用。
NOCACHE子句 ——对于那些访问不频繁的数据,这个子句可以指定当执行一个全表扫描时,将从表中获取的数据块放在缓冲中LRU列表的“最久使用”的一端。
总结
BUFFER_POOL用来指定存贮的缓冲池,而CACHE/NOCACHE指定存储的方式。当BUFFER_POOL和CACHE同时使用时,KEEP比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子句是指将表的块,放到它将要用到的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池中出去。
查看:select table_name,cache,buffer_pool from dba_tables where table_name = 'TEST';