1. 程式人生 > >buffer_pool & cache 區別與聯絡!!!

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