資料庫存取緩衝區的LRU與MRU演算法
1.Cache Hit and Cache Miss
當使用者第一次向資料庫發出查詢資料的請求的時候,資料庫會先在緩衝區中查詢該資料,如果要訪問的資料恰好已經在緩衝區中(我們稱之為Cache Hit)那麼就直接用緩衝區中讀取該資料.
反之如果緩衝區中沒有使用者要查詢的資料那麼這種情況稱之為Cache Miss,在這種情況下資料庫就會先從磁碟上讀取使用者要的資料放入緩衝區,使用者再從緩衝區讀取該資料.
很顯然從感覺上來說Cache Hit會比Cache Miss時存取速度快.
2. LRU(最近最少使用演算法) and MRU(最近最常使用演算法)
所謂的LRU(Least recently used)演算法的基本概念是:當記憶體的剩餘的可用空間不夠時,緩衝區儘可能的先保留使用者最常使用的資料,換句話說就是優先清除”較不常使用的資料”,並釋放其空間.之所以”較不常使用的資料”要用引號是因為這裡判斷所謂的較不常使用的標準是人為的、不嚴格的.所謂的MRU(Most recently used)演算法的意義正好和LRU演算法相反.
下面我們透過Oracle 9i Cache中對LRU和MRU的使用來看一下兩者在緩衝區工作機制中的作用和區別:
在Oracle 9i中有LRU List的概念: 我們可以把LRU List想象成是一連串的緩衝區集合,兩端分別是LRU端和MRU端, 當資料庫從磁碟上讀取資料放入緩衝區時,系統必須先確定緩衝區中有free buffers,這個時候Oracle 9i會掃描LRU List,掃描的基本原則是:
1. 從LRU端到MRU端;
2. 當掃描到free buffer或已掃描的緩衝區數目超過臨界值時,就會停止掃描動作;
如果在掃描過程順利的在LRU List中找到了free buffer,那麼Oracle 9i就把從磁碟讀出的資料寫到free buffer中然後把free buffer加到LRU List的MRU端.
那如果掃描過程沒有在LRU List中找到free buffer怎麼辦?當然是從LRU List的LRU端開始清除緩衝區,如此一來就可以騰出新的空間了.
下圖就是一個例子:
使用者查詢資料A,初始的時候LRU List中沒有資料A,於是Oracle 9i到磁碟讀取A,然後放到LRU List的MRU端,使用者再從LRU List中讀取資料A,同理對於B,C…當LRU List滿了以後,如果使用者查詢N,此時N不在LRU List中而且LRU List中已經沒有free buffer了,此時Oracle 9i就開始從LRU端淘汰A以騰出空間存放N.
我們再來看另外一種情況:
在State 3之後,恰好使用者持續的查詢A—這將會導致A一直被放置在靠近MRU端的緩衝區,結果將如圖State m’所示,你會發現圖2的State m’與圖1的State m緩衝區存放的資料完全一樣但是存放位置不一樣.此時LRU List滿了,如果再放N的時候LRU List`淘汰的是B,因為A的查詢率高於B,所以LRU List讓A在緩衝區中呆上較長的時間而先淘汰掉”較不常用的”的B.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-85077/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java NIO -- 緩衝區(Buffer)的資料存取Java
- zt_oracle LRU與MRUOracle
- 調節Oracle資料緩衝區引數,緩衝整個資料庫(轉)Oracle資料庫
- Oracle資料庫緩衝區命中率(轉)Oracle資料庫
- C 標準庫IO緩衝區和核心緩衝區的區別
- cuug 資料緩衝區調優
- Buffer Cache Size(資料緩衝區)
- java的緩衝流及使用Properties集合存取資料(遍歷,store,load)Java
- 關於資料庫緩衝池的問題資料庫
- 緩衝區分析
- gets()getchar()與緩衝區的問題
- Java NIO:緩衝區Java
- getchar緩衝區
- PHP的輸出緩衝區PHP
- Sybase EAServer 6.x資料庫緩衝池配置Server資料庫
- 如何計算oracle的資料緩衝區命中率與共享池的命中率Oracle
- Java NIO 之緩衝區Java
- Unity深度緩衝區指令Unity
- Java整數緩衝區Java
- nginx 緩衝區構造Nginx
- stdio流緩衝區
- 快取與緩衝快取
- pwntools緩衝區溢位與棧沒對齊
- Node.js Buffer(緩衝區)Node.js
- JavaScript WebGL 幀緩衝區物件JavaScriptWeb物件
- Linux 命令 管道 緩衝區Linux
- log buffer(日誌緩衝區)
- Java NIO 之 Buffer(緩衝區)Java
- Java NIO2:緩衝區Java
- 動態更新——緩衝區物件物件
- 緩衝區溢位實驗
- 緩衝區的個人理解!(終結版)
- RMAN的IO記憶體緩衝區記憶體
- C語言檔案與目錄(四)緩衝區C語言
- Libevent應用 (三) 資料緩衝
- 程式分析與優化 - 9 附錄 XLA的緩衝區指派優化
- 緩衝區溢位小程式分析
- PHP 輸出緩衝區應用PHP