程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> KEEP池的CACHE特點

KEEP池的CACHE特點

編輯:Oracle教程

KEEP池的CACHE特點


KEEP池的使用十分簡單,設置DB_KEEP_CACHE_SIZE的值大於0,就可以將其他對象的BUFFER_POOL參數設置為KEEP了。

ALTER TABLE T STORAGE (BUFFER_POOL KEEP);

SELECT COUNT(*) FROM T;

SELECT COUNT(*) FROM T;

從第二次才從KEEP池讀取

當KEEP池滿了後 新進來的表將會擠掉前面表所占的內存

對於第一個查詢全部物理讀比較好理解,這是由於當時KEEP池中的空間被T表占滿了,隱藏這時候對T2的查詢需要從物理磁盤讀取。執行完這個查詢,可以發現,T2表全部放入緩存中,T表的數據被替換出一部分,還有3000多個BLOCK存儲在KEEP池中。但是對T的查詢確全部由物理讀組成,而KEEP池中的緩存沒有起作用。

對於普通的DEFAULT池,Oracle使用的是最近最少使用算法,在內存中有一個類似鏈表的結構。當DB_CACHE填滿後,Oracle會從將這個鏈表的最少使用端交換出去,用來存放新的數據。而且會根據新的數據的性質,選擇把新的數據放到最多使用端還是最少使用端。

如果DB_CACHE滿後,執行的是索引掃描,則Oracle認為需要緩存這些數據,因此會清空最少使用端的空間,存放索引掃描的緩存數據。如果是大表的全表掃描,則Oracle認為這些數據是很少需要被訪問的,因此清空最少使用端的空間放入表掃描的緩存數據後,仍然放回到最少使用端。

而KEEP池沒有采用這種算法,KEEP池其實是一塊可用內存采用類似循環的算法進行訪問。如果KEEP池裡面還有剩余空間,則新的數據會首先使用剩余的空間,如果KEEP池已經存儲滿了,Oracle會從頭開始重用KEEP池。

這就是對T表的查詢導致了全部的物理讀的原因。由於T2表將T表中最初部分數據替換出KEEP,導致了查詢T表的時候,開頭部分的數據無法找到,產生了物理讀後在KEEP池中替換了T表中間部分的數據,同樣的道理,讀取到T表中部的時候,又把T表末尾的數據替換出去了。因此,執行完查詢發現,對T表查詢全部都是物理讀,KEEP池緩沖中的內容沒有起作用。

而且,由於T表的大小超過了KEEP池的大小,因此T表末尾部分的數據又會將開頭部分的數據替換出去,因此,再次對T表查詢仍然全部都是物理讀。

通過測試可以發現,CACHE選項沒有起作用,其實這也不難理解,既然放到單獨的KEEP池中,那麼必然打算將這個對象緩存,因此Oracle對所有KEEP池中的對象采用了默認CACHE的方式。而忽略對象本身的CACHE和NOCACHE選項。

KEEP池雖然有很多特點與DEFAULT池有較大的區別,但是有一點卻是二者是相似的:最近最常用的BLOCK最晚被替換出內存。

雖然KEEP池沒有采用LRU鏈表的方式,但是Oracle仍然考慮了LRU的算法,KEEP池的緩存中,仍然是越常用的BLOCK保留時間越長。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved