標籤:style blog color 使用 strong 資料
1.keep 讓SQL跑得更快。
有時候一些基礎資料表需要非常的頻繁訪問,尤其是在一些迴圈中,對該表中的訪問速度將變的非常重要。為了提高系統的處理效能,可以考慮將一些表及索引讀取並儲存到記憶體中。
二、關於keep記憶體的幾個參數
下面瞭解一下具體和CACHE有關的幾個概念,即DB_CACHE中的幾個pool:
DB_CACHE_SIZE:指定預設的buffer pool的大小,以位元組為單位。
DB_KEEP_CACHE_SIZE:指定keep buffer pool的大小,以位元組為單位。
DB_RECYCLE_CACHE_SIZE:指定recycle buffer pool的大小,以位元組為單位。
Keep Buffer Pool
其作用是緩衝那些需要經常查詢的對象但又容易被預設緩衝區置換出去的對象,按慣例,Keep pool設定為合理的大小,以使其中儲存的對象不再age out,也就是查詢這個對象的操作不會引起磁碟IO操作,可以極大地提高查詢效能。
預設的情況下db_keep_cache_size=0,未啟用,如果想要啟用,需要手工設定db_keep_cache_size的值,設定了這個值之後db_cache_size會減少。
並不是我們設定了keep pool之後,熱點表就一定能夠緩衝在keep pool,keep pool同樣也是由LRU鏈表管理的,當keep pool不夠的時候,最先緩衝到keep pool的對象會被擠出,不過與default pool中的LRU的管理方式不同,在keep pool中表永遠是從MRU移動到LRU,不會由於你做了FTS而將表緩衝到LRU端,在keep pool中對象永遠是先進先出。
Recycle Buffer Pool
Recycle Buffer Pool正好相反。Recycle Buffer Pool用於儲存臨時使用的、不被經常使用的較大的對象,這些對象放置在Default Buffer Pool顯然是不合適的,這些塊會導致過量的緩衝區重新整理輸出,而且不會帶來任何好處,因為等你想要再用這個塊時,它可已經老化退出了緩衝。要把這些段與預設池和保持池中的段分開,這樣就不會導致預設池和保持池中的塊老化而退出緩衝。
--前提:必須保證db_keep_cache_size值不為0,所以首先有如下操作:--此處只是做實驗,所以暫缺設定100M這麼大。alter system set db_keep_cache_size=100M;drop table t;create table t as select * from dba_objects;create index idx_object_id on t(object_id);--未執行KEEP命令,通過如下查詢出BUFFER_POOL列值為DEFAULT,表示未KEEP。select BUFFER_POOL from user_tables where TABLE_NAME=‘T‘;select BUFFER_POOL from user_indexes where INDEX_NAME=‘IDX_OBJECT_ID‘; alter index idx_object_id storage(buffer_pool keep); --以下將索引全部讀進記憶體select /*+index(t,idx_object_id)*/ count(*) from t where object_id is not null; --以下將資料全部讀進記憶體alter table t storage(buffer_pool keep); select /*+full(t)*/ count(*) from t;--執行KEEP操作後,通過如下查詢出BUFFER_POOL列值為KEEP,表示已經KEEP成功了select BUFFER_POOL from user_tables where TABLE_NAME=‘T‘;select BUFFER_POOL from user_indexes where INDEX_NAME=‘IDX_OBJECT_ID‘;--疑問,請問是否只有執行下面命令才是真正緩衝到keep記憶體呢? --查詢到放在keep區中的表,但是不意味著表已經被緩衝. --將表T緩衝SQL> alter table t cache;