Oracle Dababase_buffer_cache数据库高速缓存组织结构剖析
生活随笔
收集整理的這篇文章主要介紹了
Oracle Dababase_buffer_cache数据库高速缓存组织结构剖析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的教學視頻:
http://v.youku.com/v_show/id_XMzkyMjA0NDQ0.html
所做的學習筆記
其實之前已經介紹過shared pool的鏈式(chain)內存結構了..
http://nvd11.blog.163.com/blog/static/200018312201301875752730/
1.雙向鏈表
其實在Database buffer cache中, 也是用類似的chain結構, 只不過oracle一般是用雙向鏈表.
所謂單向鏈表,? 就是指每個內存塊(chunk)有1個尾部指針指向1個chunk的頭部地址. 除了最后1個chunk,尾部是空指針.
它只能單向從頭1個chunk開始單向遍歷.
而雙向鏈表則是每個chunk中前面多了個指針去指向前1個chunk的頭部地址,如下圖:
雙向鏈表的特點很明顯, 就是可以雙向遍歷啦.
2.多鏈交叉
?????? Oracle在database buffer cache中存在多鏈交叉, 也就是說1個chunk可以同時存在于多條雙向鏈中.
?????? 實現原理也很簡單, 只不過在chunk頭部和尾部再加若干個指針指向不同鏈中的下1個chunk(圖就不畫了.,,)
3.Oracle必須把database buffer cache的內存塊組織起來.
?????? 相當于1個buffer來講, database buffer cache顯得十分巨大, 單獨查找1個buffer就十分困難了, 所以有必要將各個buffer組織起來.
?????? 而查找某個buffer有多種方式:
?????? 1.例如我要找的是若干個臟塊, DBwr進程會把它們寫入dbf, 所以會存在一條專門連接臟塊的chain.
?????? 2. 例如我要找1個干凈的,而且最近訪問次數很少的, 就把它移出緩存,讓別的buffer使用, 所以會存在1條干凈塊的鏈..
?????? ....
??????
4.所以Oracle會在database buffer cache中存在很多條交叉的雙向內存鏈.
???????? 下面會介紹幾條主要的鏈
5. CBC(cache buffers chain)
???????? CBC是database buffer cache中一種很重要的鏈, 作用類似于shared pool的chain, 用于給Server Process查找需要的數據緩存.
????????? 具體流程可以參考下圖:
?
如上圖,
可以邏輯上,將database buffer cache分成兩部分, 1部分存放很多條CBC chain, 另1個就是存放buffer 區.
1. Server Process根據執行計劃, 算出了要提取的數據在某個dbf文件的某個block中,?? 例如1號 dbf 文件24號block.
2 . Server process 會根據這個block編號算出對應buffer的頭部信息在那個 chain中.
3, 在對應chain查找對應的頭部信息,
4. 找不到的話, 就會去dbf文件中把對應block分成兩部分, 頭部信息被掛到CBC 鏈(buffer header,包含對應buffer的地址類型等信息),? row data部分被寫入1其中1個空buffer中. 并修改頭部信息, 增加1個指針指向那個寫入row data的buffer中(物理讀)
?5. server process根據CBC chain中的頭部信息指針, 找到對應buffer, 提取數據給用戶.
可以理解出, 當這個block以前未被訪問過時, oracle必須執行1-5步,其中包括第4步物理讀,? 下次訪問時就只執行1 2 3 5步,只需邏輯讀了.
所以CBC鏈是將很多個buffer 的buffer header串聯起來的一條內存鏈,? 用于server process 根據block地址找到緩存中對應的buffer.
6. LRU(Least recent used) chain
??? LRU鏈, 看名字也可以大概知道, 這時一條用于查找最近最少使用的buffer的鏈.
??? 而事實上,在這條鏈掛著的都是干凈的buffer, 那么什么情況下oracle要查找最少使用的干凈buffer呢?
??? 答案也很簡單, 就是上面那副圖,
??? 第4步:找不到的話, 就會去dbf文件中把對應block分成兩部分, 頭部信息被掛到CBC 鏈(buffer header,包含對應buffer的地址類型等信息),? row data部分被寫入1其中1個空buffer中. 并修改頭部信息, 增加1個指針指向那個寫入row data的buffer中(物理讀)
?? 注意高亮的空buffer就是指free buffer, oracle會優先將數據文件的block數據緩存在這些free 的 buffer中, 因為這些buffer沒有數據時空的嘛.
???? 但是當數據庫穩定運行一段時間之后,? database buffer cache里面就幾乎沒有空的buffer了, 都是有數據占用的buffer,
???? 前面幾篇文章都提到過,? 這些有數據的buffer 分兩種, 一種是干凈的, 一種是臟的.?? 而臟的數據是指還未被DBWR進程寫入數據文件,是不可以用的, 詳細請看這里:
http://nvd11.blog.163.com/blog/static/200018312201301592518115/
????? 所以Oracle只能把干凈的buffer挑出1個,然后讓新的block數據寫到這個buffer中.? 但是因為原來干凈的buffer數據被覆蓋.所以下次訪問這個buffer的數據就要重新進行1次物理讀了.
????? 所以Oracle就要根據最近訪問次數排序,從而選出最近訪問最少的那些干凈buffer, 作為新的可用空間.
????? 所以database buffer cache會存在一種內存鏈, 這條鏈會根據最近訪問次數將干凈buffer按次數多少連接起來, 這條鏈就是LRC鏈了.
???? lRC鏈與其他chain一樣,都有頭部和尾部,? 頭部就是最近訪問次數最少的buffer,叫做冷端(cold end),? 反之尾部就叫熱端(most end). 而oracle會不斷維護這條LRC鏈(如根據訪問次數調整順序),當需要替換干凈buffer時, 就會從冷端開始找啦.
7. LRUW(Least recent used WRITED) chain
??? 與上面那條LRC chain對應, 有一條專門for? 臟buffer的鏈, 而且是按最近修改次數排序的.
???
???? 那什么時候需要者條鏈呢, 事實上, Oracle有條DBWR 后臺進程, 專門負責將database buffer cache里的臟數據寫回dbf, 一旦寫回,這個臟的buffer就變成干凈的了.? 這個動作時很費時間的,因為這是1個物理寫動作.
?????? 但是如果1個臟buffer最近修改次數很多, DBWR就算寫回dbf, 很可能不久后又一次修改(就是又臟了), 所以DBWR會優先將那些最近修改次數最少的臟buffer 寫回dbf, 可以避免多余的物理寫(物理IO)啊~
????? 而LRUW鏈就是為DBWR找到最近最少修改的臟buffer服務的. 不難理解.
8. Check Point Queue (檢查點隊列) chain
???? 這條鏈式按照第一次被修改的時間排序的臟buffer鏈.
???? 注意2點:
???? 1, 里面都是臟buffer
????? 2. 按照第一次被修改(變臟)時間排序
???????????????? 也就說有3個buffer?? 假如它們第一次修改時間分別是? 12:00 13:00 14:00, 那么它們就按照這個順序排序了, 假如15:00 時第1個buffer又被修改了,? 但是這時它們的順序不會變, 因為順序依據是第一次的被修改時間啊~
???? 這條鏈有什么作用呢,? 視頻里老相老師沒有說,他說以后再講, 我也以后再補充吧...
http://v.youku.com/v_show/id_XMzkyMjA0NDQ0.html
所做的學習筆記
其實之前已經介紹過shared pool的鏈式(chain)內存結構了..
http://nvd11.blog.163.com/blog/static/200018312201301875752730/
1.雙向鏈表
其實在Database buffer cache中, 也是用類似的chain結構, 只不過oracle一般是用雙向鏈表.
所謂單向鏈表,? 就是指每個內存塊(chunk)有1個尾部指針指向1個chunk的頭部地址. 除了最后1個chunk,尾部是空指針.
它只能單向從頭1個chunk開始單向遍歷.
而雙向鏈表則是每個chunk中前面多了個指針去指向前1個chunk的頭部地址,如下圖:
雙向鏈表的特點很明顯, 就是可以雙向遍歷啦.
2.多鏈交叉
?????? Oracle在database buffer cache中存在多鏈交叉, 也就是說1個chunk可以同時存在于多條雙向鏈中.
?????? 實現原理也很簡單, 只不過在chunk頭部和尾部再加若干個指針指向不同鏈中的下1個chunk(圖就不畫了.,,)
3.Oracle必須把database buffer cache的內存塊組織起來.
?????? 相當于1個buffer來講, database buffer cache顯得十分巨大, 單獨查找1個buffer就十分困難了, 所以有必要將各個buffer組織起來.
?????? 而查找某個buffer有多種方式:
?????? 1.例如我要找的是若干個臟塊, DBwr進程會把它們寫入dbf, 所以會存在一條專門連接臟塊的chain.
?????? 2. 例如我要找1個干凈的,而且最近訪問次數很少的, 就把它移出緩存,讓別的buffer使用, 所以會存在1條干凈塊的鏈..
?????? ....
??????
4.所以Oracle會在database buffer cache中存在很多條交叉的雙向內存鏈.
???????? 下面會介紹幾條主要的鏈
5. CBC(cache buffers chain)
???????? CBC是database buffer cache中一種很重要的鏈, 作用類似于shared pool的chain, 用于給Server Process查找需要的數據緩存.
????????? 具體流程可以參考下圖:
?
如上圖,
可以邏輯上,將database buffer cache分成兩部分, 1部分存放很多條CBC chain, 另1個就是存放buffer 區.
1. Server Process根據執行計劃, 算出了要提取的數據在某個dbf文件的某個block中,?? 例如1號 dbf 文件24號block.
2 . Server process 會根據這個block編號算出對應buffer的頭部信息在那個 chain中.
3, 在對應chain查找對應的頭部信息,
4. 找不到的話, 就會去dbf文件中把對應block分成兩部分, 頭部信息被掛到CBC 鏈(buffer header,包含對應buffer的地址類型等信息),? row data部分被寫入1其中1個空buffer中. 并修改頭部信息, 增加1個指針指向那個寫入row data的buffer中(物理讀)
?5. server process根據CBC chain中的頭部信息指針, 找到對應buffer, 提取數據給用戶.
可以理解出, 當這個block以前未被訪問過時, oracle必須執行1-5步,其中包括第4步物理讀,? 下次訪問時就只執行1 2 3 5步,只需邏輯讀了.
所以CBC鏈是將很多個buffer 的buffer header串聯起來的一條內存鏈,? 用于server process 根據block地址找到緩存中對應的buffer.
6. LRU(Least recent used) chain
??? LRU鏈, 看名字也可以大概知道, 這時一條用于查找最近最少使用的buffer的鏈.
??? 而事實上,在這條鏈掛著的都是干凈的buffer, 那么什么情況下oracle要查找最少使用的干凈buffer呢?
??? 答案也很簡單, 就是上面那副圖,
??? 第4步:找不到的話, 就會去dbf文件中把對應block分成兩部分, 頭部信息被掛到CBC 鏈(buffer header,包含對應buffer的地址類型等信息),? row data部分被寫入1其中1個空buffer中. 并修改頭部信息, 增加1個指針指向那個寫入row data的buffer中(物理讀)
?? 注意高亮的空buffer就是指free buffer, oracle會優先將數據文件的block數據緩存在這些free 的 buffer中, 因為這些buffer沒有數據時空的嘛.
???? 但是當數據庫穩定運行一段時間之后,? database buffer cache里面就幾乎沒有空的buffer了, 都是有數據占用的buffer,
???? 前面幾篇文章都提到過,? 這些有數據的buffer 分兩種, 一種是干凈的, 一種是臟的.?? 而臟的數據是指還未被DBWR進程寫入數據文件,是不可以用的, 詳細請看這里:
http://nvd11.blog.163.com/blog/static/200018312201301592518115/
????? 所以Oracle只能把干凈的buffer挑出1個,然后讓新的block數據寫到這個buffer中.? 但是因為原來干凈的buffer數據被覆蓋.所以下次訪問這個buffer的數據就要重新進行1次物理讀了.
????? 所以Oracle就要根據最近訪問次數排序,從而選出最近訪問最少的那些干凈buffer, 作為新的可用空間.
????? 所以database buffer cache會存在一種內存鏈, 這條鏈會根據最近訪問次數將干凈buffer按次數多少連接起來, 這條鏈就是LRC鏈了.
???? lRC鏈與其他chain一樣,都有頭部和尾部,? 頭部就是最近訪問次數最少的buffer,叫做冷端(cold end),? 反之尾部就叫熱端(most end). 而oracle會不斷維護這條LRC鏈(如根據訪問次數調整順序),當需要替換干凈buffer時, 就會從冷端開始找啦.
7. LRUW(Least recent used WRITED) chain
??? 與上面那條LRC chain對應, 有一條專門for? 臟buffer的鏈, 而且是按最近修改次數排序的.
???
???? 那什么時候需要者條鏈呢, 事實上, Oracle有條DBWR 后臺進程, 專門負責將database buffer cache里的臟數據寫回dbf, 一旦寫回,這個臟的buffer就變成干凈的了.? 這個動作時很費時間的,因為這是1個物理寫動作.
?????? 但是如果1個臟buffer最近修改次數很多, DBWR就算寫回dbf, 很可能不久后又一次修改(就是又臟了), 所以DBWR會優先將那些最近修改次數最少的臟buffer 寫回dbf, 可以避免多余的物理寫(物理IO)啊~
????? 而LRUW鏈就是為DBWR找到最近最少修改的臟buffer服務的. 不難理解.
8. Check Point Queue (檢查點隊列) chain
???? 這條鏈式按照第一次被修改的時間排序的臟buffer鏈.
???? 注意2點:
???? 1, 里面都是臟buffer
????? 2. 按照第一次被修改(變臟)時間排序
???????????????? 也就說有3個buffer?? 假如它們第一次修改時間分別是? 12:00 13:00 14:00, 那么它們就按照這個順序排序了, 假如15:00 時第1個buffer又被修改了,? 但是這時它們的順序不會變, 因為順序依據是第一次的被修改時間啊~
???? 這條鏈有什么作用呢,? 視頻里老相老師沒有說,他說以后再講, 我也以后再補充吧...
總結
以上是生活随笔為你收集整理的Oracle Dababase_buffer_cache数据库高速缓存组织结构剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle Buffer-cache
- 下一篇: Oracle Database_buff