OCP知識點講解 之 什麼是Buffer Cache?

abraham_dba_2013發表於2014-12-05

一、Buffer cache作用:

     Buffer cache是Oracle建立的資料檔案的緩衝區。Oracle中所有Select、DML、DDL等命令,凡是需要所有對資料檔案進行讀、寫操作的,基本上都是對Buffer cache進行讀、寫操作。如果需要讀或寫的塊沒有包括在Buffer cache,Oracle會先把它讀進Buffer cache中,再進行讀、寫。

     通常,如果要讀的塊已經在Buffer cache中了,Oracle將不必再訪問磁碟資料檔案,這個讀操作被稱為邏輯讀。也就是沒有真正讀寫磁碟的意思。

     如果要讀的塊不在Buffer cache,那麼Oracle必須到磁碟上將其調入Buffer cache中,這個操作被稱為物理讀。再將塊物理讀進Buffer cache後,Oracle再從Buffer cache中邏輯讀取需要的資料。



二、Buffer cache大小的設定:

     在Oracle 10g中,非常簡單,我們不必設定Buffer cache的大小,只需設定一個sga_target引數,SGA目標值,10g將會根據你的資料庫的情況,自動調整共享池、Buffer cache池等等所有SGA中記憶體元件的大小。db_cache_size引數是設定Buffer cache大小的,和共享池一樣,在Oracle 10g中,它也只是個下限值。

     Buffer cache是磁碟資料檔案的快取,資料檔案的基本讀寫單位是Oracle資料塊,最常的塊大小是4KB、8KB、16KB等等,在我們的例項庫,資料庫塊大小是8KB。也就是說Oracle一次讀寫將從資料檔案中讀寫8KB位元組。Buffer cache既然是資料檔案的直接快取,Buffer cache的記憶體塊大小當然也是8KB了。

     Oracle從9i之後開始支援多重塊大小,你在建立資料庫時設定的塊大小被稱為標準塊大小,除了標準塊大小外,我們還可以使用多個非標準的塊大小。就像我們的例項庫,標準塊大小是8KB,我們還可以使用2KB、4KB、16KB和32KB的非標準塊大小。

     那麼,資料庫有必要使用多種塊大小嗎?絕對有必要。對於全表掃描操作,越大的塊效率越高。因為全表掃描要訪問表所有的行,所有塊。塊越大,相同大小的表所佔用的塊就越少。而每讀一個塊,Oracle都算作一次物理讀,表塊越少,訪問全表所需的物理讀就越少。因此,全表掃描操作適合大塊。但對於索引掃描,索引掃描是一種隨機的形式訪問表中的行。隨機訪問下小塊效率更好。因為你每訪問一個塊,Oracle都要將塊讀進Buffer cahce,這樣做的目的是希望你再次訪問塊中其他行時,不必再從磁碟讀取(從磁碟中讀是物理讀),而直接從記憶體中讀取(從記憶體中讀是邏輯讀)。隨機訪問很可能訪問完塊中一行後,就不再訪問此塊了。因此是隨機本身就是無規律的訪問。因為小塊佔用的記憶體少,隨機訪問下,將小塊讀入記憶體比將大塊讀入記憶體,能更節省記憶體空間,提高記憶體的使用效率。因此,隨機訪問下,小塊的效率比大塊要好一些。還有,大塊的爭用可能性更高,而小塊爭用的可能性低。因為大塊中行比較多,而小塊中行少。這就好像一個團隊有100個人,另一個團隊有10個人,當然人越多越容易發生矛盾。總之,大塊有大塊的好低,小塊有小塊的好處,如果資料庫只能使用一種塊大小,這顯然是不太合理的。

     我們在Oracle體系結構部分就瞭解瞭如何配置使用非標準塊大小,其要點有如下兩點:

     ·只有配置了相應非標準塊大小的Buffer cache池後,才能使用非標準塊大小

     ·非標準塊大小是在表空間層指定的。一旦在表空間層確定了表空間所使用的塊大小,以後被建立在此表空間中的所有表、索引等等段物件,都將按表空間塊大小為準。

     有一定需要補充的是,用來配置非標準塊大小Buffer cache的初始化引數db_16k_cache_size、db_2k_cache_size、db_32k_cache_size、db_4k_cache_size、db_8k_cache_size,它們並不在Oracle自動記憶體管理的範籌內,Oracle並不會自動的調整他們的大小。你將這些引數設定為多大,只要SGA內還有空閒記憶體,Oracle將會立即分配相應大小的記憶體空間。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29439655/viewspace-1357843/,如需轉載,請註明出處,否則將追究法律責任。

相關文章