Database Buffer Cache

資料庫緩衝快取區(DB Buffer Cache)是SGA的一部分,用於存放從資料檔案讀取的資料Block的副本。當使用者第一次需要特定資料時,將在DB Buffer Cache中搜尋資料。快取記憶體中的緩衝區由一個複雜演算法管理,該演算法稱為LRU機制。

      之前提過,Oracle有一個很重要的觀念,就是不到絕對必要,不會等待I/O。I/O是電腦系統中最慢的一個部份,因此,所執行的I/O是越少越好,資料庫緩衝快取區(Database Buffer Cache)即是因應此概念而規劃出來,其重點如下:


  • 主要用來存放最近使用過的資料。
  • 資料庫緩衝快取區可存放讀取自資料庫裡面的資料,當使用者透過應用程式第一次向Oracle資料庫送出查詢需求時,Oracle會先在資料庫緩衝快取區內尋找該資料,如果有需要的資料,就直接從資料庫緩衝快取區回傳給使用者稱為快取命中(cache hit),這麼一來,即可減少硬碟上的I/O次數,如果Oracle發現使用者要的資料並不在資料庫緩衝快取區裡面稱為快取失誤(cache miss),Oracle會從資料庫中讀取所需要的資料blocks(讀取方式是以block方式讀取,因此,存到資料庫緩衝快取區也是以block方式),先放入資料庫緩衝快取區裡面,再傳送給使用者。快取記憶體命中時訪問資料要比快取記憶體未命中時存取資料要快很多。
資料庫緩衝快取的種類

資料庫緩衝快取區包含以下三種不同性質的快取,利用這三種快取,可區分整個資料庫緩衝快取區的快取類別:
  • Dirty Buffer:是指存放已修改、但尚未寫入資料庫的資料之緩衝區,舉個例子,當使用者要修改一筆資料時,Oracle會將這筆資料所在的block透過背景處理程序(Background Process)讀到資料庫緩衝快取區進行修改資料,當修改完之後需要等待適當時機回寫資料庫中,此時筆資料在資料庫中的block是尚未修改前的資料,而修改後的資料還在資料庫緩衝快取區裏面,此時在資料庫緩衝快取區裏的那個block就是Dirty Buffer。
  • Free Buffer:是指這個block buffer內容和資料庫裡的資料是一模一樣的,因為是一模一樣的,所以可以被隨時覆蓋掉,因為即使被覆蓋掉,仍然可以在資料檔找到一模一樣的內容。
  • Pinned Buffer:是指正在被寫入的block buffer,可能是被讀取,也有可能是被寫入的,也就是正在被I/O的狀態下。
資料庫緩衝快取的管控方式
   了解了資料庫緩衝快取的種類後,Oracle資料庫又是如何來管控這三種的快取類別呢?是利用Wrist List和LRU List這兩種機制來管控。

  • Dirty list:包含存放dirty buffer,主要是將資料於適當的時機寫入資料庫。
  • LRU list:包含free buffer、dirty buffer、pinned buffers。
P.S. 詳細的資料庫緩衝快取區運作方式須配合DBWRn解說

沒有留言:

張貼留言