oracle緩存池使用解析

oracle有三種類型的緩存池,分別是default,keep和recycle。默認狀況下只會使用default緩存池,另外兩種須要額外配置。
keep緩存池至關因而一直很熱的default緩存池,緩存池裏的數據會一直保留,直到被其餘使用該池的數據搶佔,而且是使用先進先出的隊列使用。
recycle緩存池至關因而一直很冷的default緩存池,裏面的數據會很快被清理。sql

通常狀況下只需使用default緩存池便可知足須要,有時爲了進一步提升效率,在瞭解表的使用模式的狀況下,可使用keep池來減小數據庫物理讀的數量,顯著提升效率,這一切都創建在對數據使用模式很熟悉的狀況。數據庫

使用keep緩存池
首先查看內存分配狀況緩存

show parameter memory_target;
show parameter sga_target;
show parameter db%cache_size;

這是在11g的版本上的狀況,若是使用了自動內存管理,sga_target,db_cache_size,db_keep_cache_size可能都是沒有設置值的。
直接設置db_keep_cache_size,若是不能成功可能須要設置一個sga_target下限值,而後再設置db_keep_cache_size。markdown

要使用keep緩存池還須要設置表的buffer_pool存儲屬性(建立表時或者直接修改存儲屬性)oracle

alter table xxx storage(buffer_pool keep);
alter table xxx modify partition part0 storage(buffer_pool keep);

設置完畢按理來講就能夠開始使用keep緩存池了,通常的小量數據查詢如今已經可使用keep池了,可是全表掃描還不會使用keep緩存池,這是爲何呢,由於11g開始對全表掃描會使用一種direct path read技術,直接將數據從磁盤讀到pga,繞過緩存,也就固然不會將數據放在keep緩存池了。
由兩個隱藏參數控制direct path read技術是否使用,_small_table_threshold和_serial_direct_read。默認是開啓direct path read的,當表小於_small_table_threshold時,所讀數據會放在數據庫緩存裏。
直接設置這兩個值都不是很理想的方案。spa

若是想要將一個設置了keep的表的塊所有裝入keep緩存池裏,可使用一個技巧,使用索引進行全表掃描,強迫數據庫將數據放到keep緩存池裏。
select /+ index(test_keep idx_keep) / count(*) from test_keep;code

keep緩存池使用還有一個問題,若是是分區表某些分區是keep,某些是default,若是使用全表掃描的查詢若是包含了keep的數據,也有default數據,則仍是因爲direct path read技術,已經在keep緩存裏的數據會被無視。索引

相關文章
相關標籤/搜索