buffer_pool & cache 区别与联系!!!

 BUFFER_POOL
语法如下: create/alter table ...... storage(buffer_pool  keep);
BUFFER_POOL子句可指定一个数据库对象的默认缓冲池。这个对象的所有数据块存储在指定的缓存中。BUFFER_POOL 3个pool,其大小分别对应3个参,这3个POOL相互独立,没有包含的关系。DEFAULT  DB_CACHE_SIZE;KEEP     DB_KEEP_CACHE_SIZE;RECYCLE  DB_RECYCLE_CACHE_SZIE。
DEFAULT ——指定DEFAULT将适用默认的缓冲池。这个选项适用于没有分配给KEEP缓冲池和RECYCLE缓冲池的其它数据库对象。
KEEP ——通常将经常访问的对象放入keep pool中,指定KEEP将把数据块放入KEEP缓冲池中。维护一个适当尺寸的KEEP缓冲池可以使Oracle在内存中保留数据库对象而避免I/O操作。在表、聚集、实体化视图或实体化视图日志上,KEEP子句的优先权大于NOCACHE子句。
RECYCLE ——通常将偶尔访问的大表放入recycle pool中,指定RECYCLE将把数据块放入RECYCLE缓冲池中。一个适当尺寸的RECYCLE缓冲池可以减少默认缓冲池为RECYCLE缓冲池的数据库对象的数量,以避免它们占用不必要的缓冲空间。

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';

你可能感兴趣的:(Oracle)