KEEP池的CACHE特點

2021-07-03 08:24:25 字數 1446 閱讀 9480

keep

池的使用十分簡單,設定d

b_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保留時間越長。

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 從...

高可用性Cache池

前段時間開發上線了乙個cache池,使用雙層cache池冗餘,宕掉一台機器的cache失效從1 n降到1 n 2。如果2層cache池分開機器部署,失效率將會降到0。上線不久剛好碰上一次宕機事故,效果很好。該應用有16臺cache伺服器,高峰時每秒訪問約20萬次,平時的命中率約為99.95 宕掉一台...

4種執行緒池的特點介紹

fixthreadpoolcachedthreadpoolscheduledthreadpoolsinglethreadpool1.1 通過exector的newfixedthreadpool靜態方法來建立 1.2 執行緒數量固定的執行緒池 1.3 只有核心執行緒切並且不會被 1.4 當所有執行緒都...