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

oracle緩存池使用解析,oracle緩存池

編輯:Oracle教程

oracle緩存池使用解析,oracle緩存池


oracle有三種類型的緩存池,分別是default,keep和recycle。默認情況下只會使用default緩存池,另外兩種需要額外配置。
keep緩存池相當於是一直很熱的default緩存池,緩存池裡的數據會一直保留,直到被其他使用該池的數據搶占,並且是使用先進先出的隊列使用。
recycle緩存池相當於是一直很冷的default緩存池,裡面的數據會很快被清理。

一般情況下只需使用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。

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

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時,所讀數據會放在數據庫緩存裡。
直接設置這兩個值都不是很理想的方案。

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

keep緩存池使用還有一個問題,如果是分區表某些分區是keep,某些是default,如果使用全表掃描的查詢如果包含了keep的數據,也有default數據,則還是由於direct path read技術,已經在keep緩存裡的數據會被無視。

 

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