日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Oracle Dababase_buffer_cache数据库高速缓存组织结构剖析

發(fā)布時間:2025/3/20 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle Dababase_buffer_cache数据库高速缓存组织结构剖析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的教學(xué)視頻:
http://v.youku.com/v_show/id_XMzkyMjA0NDQ0.html
所做的學(xué)習(xí)筆記


其實之前已經(jīng)介紹過shared pool的鏈?zhǔn)?chain)內(nèi)存結(jié)構(gòu)了..
http://nvd11.blog.163.com/blog/static/200018312201301875752730/

1.雙向鏈表
其實在Database buffer cache中, 也是用類似的chain結(jié)構(gòu), 只不過oracle一般是用雙向鏈表.

所謂單向鏈表,? 就是指每個內(nèi)存塊(chunk)有1個尾部指針指向1個chunk的頭部地址. 除了最后1個chunk,尾部是空指針.
它只能單向從頭1個chunk開始單向遍歷.

而雙向鏈表則是每個chunk中前面多了個指針去指向前1個chunk的頭部地址,如下圖:
雙向鏈表的特點很明顯, 就是可以雙向遍歷啦.




2.多鏈交叉
?????? Oracle在database buffer cache中存在多鏈交叉, 也就是說1個chunk可以同時存在于多條雙向鏈中.
?????? 實現(xiàn)原理也很簡單, 只不過在chunk頭部和尾部再加若干個指針指向不同鏈中的下1個chunk(圖就不畫了.,,)


3.Oracle必須把database buffer cache的內(nèi)存塊組織起來.
?????? 相當(dāng)于1個buffer來講, database buffer cache顯得十分巨大, 單獨查找1個buffer就十分困難了, 所以有必要將各個buffer組織起來.
?????? 而查找某個buffer有多種方式:
?????? 1.例如我要找的是若干個臟塊, DBwr進程會把它們寫入dbf, 所以會存在一條專門連接臟塊的chain.
?????? 2. 例如我要找1個干凈的,而且最近訪問次數(shù)很少的, 就把它移出緩存,讓別的buffer使用, 所以會存在1條干凈塊的鏈..
?????? ....
??????
4.所以O(shè)racle會在database buffer cache中存在很多條交叉的雙向內(nèi)存鏈.
????????
下面會介紹幾條主要的鏈

5. CBC(cache buffers chain)
???????? CBC是database buffer cache中一種很重要的鏈, 作用類似于shared pool的chain, 用于給Server Process查找需要的數(shù)據(jù)緩存.
????????? 具體流程可以參考下圖:
?

如上圖,
可以邏輯上,將database buffer cache分成兩部分, 1部分存放很多條CBC chain, 另1個就是存放buffer 區(qū).



1. Server Process根據(jù)執(zhí)行計劃, 算出了要提取的數(shù)據(jù)在某個dbf文件的某個block中,?? 例如1號 dbf 文件24號block.
2 . Server process 會根據(jù)這個block編號算出對應(yīng)buffer的頭部信息在那個 chain中.
3, 在對應(yīng)chain查找對應(yīng)的頭部信息,
4. 找不到的話, 就會去dbf文件中把對應(yīng)block分成兩部分, 頭部信息被掛到CBC 鏈(buffer header,包含對應(yīng)buffer的地址類型等信息),? row data部分被寫入1其中1個空buffer中. 并修改頭部信息, 增加1個指針指向那個寫入row data的buffer中(物理讀)
?5. server process根據(jù)CBC chain中的頭部信息指針, 找到對應(yīng)buffer, 提取數(shù)據(jù)給用戶.

可以理解出, 當(dāng)這個block以前未被訪問過時, oracle必須執(zhí)行1-5步,其中包括第4步物理讀,? 下次訪問時就只執(zhí)行1 2 3 5步,只需邏輯讀了.

所以CBC鏈?zhǔn)菍⒑芏鄠€buffer 的buffer header串聯(lián)起來的一條內(nèi)存鏈,? 用于server process 根據(jù)block地址找到緩存中對應(yīng)的buffer.


6. LRU(Least recent used) chain
??? LRU鏈, 看名字也可以大概知道, 這時一條用于查找最近最少使用的buffer的鏈.
??? 而事實上,在這條鏈掛著的都是干凈的buffer, 那么什么情況下oracle要查找最少使用的干凈buffer呢?

??? 答案也很簡單, 就是上面那副圖,
??? 第4步:找不到的話, 就會去dbf文件中把對應(yīng)block分成兩部分, 頭部信息被掛到CBC 鏈(buffer header,包含對應(yīng)buffer的地址類型等信息),? row data部分被寫入1其中1個空buffer中. 并修改頭部信息, 增加1個指針指向那個寫入row data的buffer中(物理讀)

?? 注意高亮的空buffer就是指free buffer, oracle會優(yōu)先將數(shù)據(jù)文件的block數(shù)據(jù)緩存在這些free 的 buffer中, 因為這些buffer沒有數(shù)據(jù)時空的嘛.

???? 但是當(dāng)數(shù)據(jù)庫穩(wěn)定運行一段時間之后,? database buffer cache里面就幾乎沒有空的buffer了, 都是有數(shù)據(jù)占用的buffer,

???? 前面幾篇文章都提到過,? 這些有數(shù)據(jù)的buffer 分兩種, 一種是干凈的, 一種是臟的.?? 而臟的數(shù)據(jù)是指還未被DBWR進程寫入數(shù)據(jù)文件,是不可以用的, 詳細請看這里:
http://nvd11.blog.163.com/blog/static/200018312201301592518115/

????? 所以O(shè)racle只能把干凈的buffer挑出1個,然后讓新的block數(shù)據(jù)寫到這個buffer中.? 但是因為原來干凈的buffer數(shù)據(jù)被覆蓋.所以下次訪問這個buffer的數(shù)據(jù)就要重新進行1次物理讀了.

????? 所以O(shè)racle就要根據(jù)最近訪問次數(shù)排序,從而選出最近訪問最少的那些干凈buffer, 作為新的可用空間.

????? 所以database buffer cache會存在一種內(nèi)存鏈, 這條鏈會根據(jù)最近訪問次數(shù)將干凈buffer按次數(shù)多少連接起來, 這條鏈就是LRC鏈了.

???? lRC鏈與其他chain一樣,都有頭部和尾部,? 頭部就是最近訪問次數(shù)最少的buffer,叫做冷端(cold end),? 反之尾部就叫熱端(most end). 而oracle會不斷維護這條LRC鏈(如根據(jù)訪問次數(shù)調(diào)整順序),當(dāng)需要替換干凈buffer時, 就會從冷端開始找啦.

7. LRUW(Least recent used WRITED) chain
??? 與上面那條LRC chain對應(yīng), 有一條專門for? 臟buffer的鏈, 而且是按最近修改次數(shù)排序的.
???
???? 那什么時候需要者條鏈呢, 事實上, Oracle有條DBWR 后臺進程, 專門負(fù)責(zé)將database buffer cache里的臟數(shù)據(jù)寫回dbf, 一旦寫回,這個臟的buffer就變成干凈的了.? 這個動作時很費時間的,因為這是1個物理寫動作.

?????? 但是如果1個臟buffer最近修改次數(shù)很多, DBWR就算寫回dbf, 很可能不久后又一次修改(就是又臟了), 所以DBWR會優(yōu)先將那些最近修改次數(shù)最少的臟buffer 寫回dbf, 可以避免多余的物理寫(物理IO)啊~

????? 而LRUW鏈就是為DBWR找到最近最少修改的臟buffer服務(wù)的. 不難理解.

8. Check Point Queue (檢查點隊列) chain
???? 這條鏈?zhǔn)桨凑盏谝淮伪恍薷牡臅r間排序的臟buffer鏈.

???? 注意2點:
???? 1, 里面都是臟buffer
????? 2. 按照第一次被修改(變臟)時間排序
???????????????? 也就說有3個buffer?? 假如它們第一次修改時間分別是? 12:00 13:00 14:00, 那么它們就按照這個順序排序了, 假如15:00 時第1個buffer又被修改了,? 但是這時它們的順序不會變, 因為順序依據(jù)是第一次的被修改時間啊~

???? 這條鏈有什么作用呢,? 視頻里老相老師沒有說,他說以后再講, 我也以后再補充吧...

總結(jié)

以上是生活随笔為你收集整理的Oracle Dababase_buffer_cache数据库高速缓存组织结构剖析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。