buffer cache的設定隨著Oracle版本的升級而不斷變化。Oracle 8i下使用db_block_buffers來設定,該參數表示buffer cache中所能夠包含的記憶體資料區塊的個數;Oracle 9i以後使用db_cache_size來設定,該參數表示buffer cache的總共的容量,可以用位元組、KB、MB為單位來進行設定。而到了Oracle 10g以後則更加簡單,甚至可以不用去單獨設定buffer cache的大小。因為Oracle 10g引入了ASMM(Automatic Shared Memory Management)這樣一個可以進行自我調整的組件,該組件可以自動調整shared pool size、db cache size等SGA中的組件。只需要設定sga_target參數,再設定statistics_level為typical或all,則其他組件就能夠根據系統的負載和曆史資訊自動地調整各個部分的大小。
從Oracle 8.0以後,Oracle提供了三種類型的buffer cache,分別是default、keep、recycle。keep和recycle是可選的,default必須存在。Oracle 8i以後使用db_cache_size設定default池、db_keep_cache_size設定keep池、db_recycle_cache_size設定recycle池。
通常將經常訪問的對象放入keep類型的buffer cache裡,而將不常訪問的大表放入recycle類型的buffer cache裡。其他沒有指定buffer cache類型的對象都將進入default類型的buffer cache裡。為對象指定buffer cache類型的方法如下:
SQL> create table test (n number) storage (buffer_pool keep);
SQL> alter table test storage (buffer_pool recycle);
如果沒有指定buffer_pool短語,則表示該對象進入default類型的buffer cache。
這裡要說明的是,從名字上看,很容易讓人誤以為這三種buffer cache提供了三種不同的管理記憶體資料區塊的機制。但事實上,它們之間在管理和內部機制上沒有任何的區別。它們僅僅是為DBA們提供了一個選擇,就是能夠將資料庫物件分成“非常熱的”、“比較熱的”和“不熱的”這三種類型。因為資料庫中總會存在一些“非常熱”的對象,它們頻繁地被訪問。而如果某個時候系統偶爾做了一次大表的全表掃描,就有可能將這些對象清除出記憶體。為了防止這種情況的發生,我們可以設定keep類型的buffer cache,並將這種非常熱的對象都移入keep buffer cache中。同樣的,資料庫中也總會有一些很大的表,可能每月為了產生一張報表,而只需要訪問一次就可以了。但有可能就是這麼一次訪問,就將大部分的記憶體資料區塊清除出了buffer cache。為了避免這種情況的發生,可以設定recycle類型的buffer cache,並將這種偶爾訪問的大表移入recycle buffer cache。
毫無疑問,如果我們要設定這三種類型的buffer cache,則需要自己研究並根據資料庫中的對象進行分類,計算這些對象的大小以後,從而才能夠正確的把它們放入不同的buffer cache。但是,不管怎麼說,設定這三種類型的buffer cache只能算是最低層次的最佳化,也就是說在我們沒有任何辦法的情況下,可以考慮設定它們。但是如果我們能夠對某條讀取了過多資料區塊的SQL語句進行調優的話,使其buffer gets降低50%的話,就會比設定多個buffer cache要好得多了。
Oracle 9i以後還提供了可以設定多種資料區塊尺寸(2、4、8、16 或 32)的buffer cache,以便存放不同資料區塊尺寸的資料表空間中的對象。使用初始化參數db_Nk_cache_size來指定不同資料區塊尺寸的buffer cache,這裡的N就是2、4、8、16 或 32。建立資料庫時,使用初始化參數db_block_size所指定預設的標準資料區塊尺寸,標準資料區塊尺寸用於system資料表空間。然後可以指定最多4個不同的、非標準資料區塊尺寸的資料表空間。每種資料區塊尺寸的資料表空間必須對應一種不同尺寸的buffer cache,否則不能建立不同資料區塊尺寸的資料表空間。
SQL> create tablespace tbs_test_16k
2 datafile 'C:\oracle\oradata\ora92\tbs_test_16k.dbf' size 10M
3 blocksize 16k;
create tablespace tbs_test_16k
*
ERROR 位於第 1 行:
ORA-29339: 資料表空間塊大小 16384 與配置的塊大小不匹配
SQL> show parameter db_16k_cache_size
NAME TYPE VALUE
------------------- ----------- ----------
db_16k_cache_size big integer 0
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/