KEEP POOL和CACHE屬性的區別

okone96發表於2007-01-04

我們知道可以設定表的屬性CACHE將表資料放入資料快取中,也可以設定表將其放入KEEP緩衝池,這兩者的區別如下:

BUFFER POOL包括DEFAULT、KEEP、RECYCLE三個POOL,其大小分別對應三個引數:
DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SZIE,這三個POOL相互獨立,沒有包含的關係。
語法如下:
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.

全表掃描時,資料是放入default pool的LRU冷端,所以可能很快就會被從記憶體中age out,
對一些頻繁使用的小表來說效率就比較底了,所以使用cache 子句,在全表掃描時,讓oracle
把資料放入LRU的熱端,避免很快被age out,如果有太多的表cache,LRU連結串列會很擁擠,LRU機
制也會受影響,所以該把表放入keep pool,而且cache子句也不適合大表,因為有可能這個大
表會佔據整個LRU連結串列。

對於放入KEEP POOL中的表資料,要麼全表放入,要麼全表都out,不會只放入一部分資料。

當BUFFER_POOL和CACHE同時使用時,KEEP比NOCACHE有優先權。
BUFFER_POOL用來指定存貯的緩衝池,而CACHE/NOCACHE指定儲存的方式。


附註:對於8i,需要設定引數buffer_pool_keep,還要修改 db_block_lru_latches,
該引數預設是1,無法使用buffer_pool_keep。該引數應該比2*3*CPU數量少,但是要
大於 1,才能使用buffer_pool_keep。buffer_pool_keep從db_block_buffers中分配,
因此也要小於db_block_buffers。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-888324/,如需轉載,請註明出處,否則將追究法律責任。

相關文章