Oracle10g data buffer cache的記憶體結構

tolywang發表於2010-05-05

buffer cache的記憶體結構

連結串列和Hash演算法是Oracle實現內部管理常用的方式。

連結串列是一種資料結構,透過將物件串聯在一起,從而構成連結串列結構,這樣如果要修改,刪除或查詢某個物件的話,
都可以先到連結串列中去查詢,而不必實際地訪問物理介質 。

使用者發出SQL語句(假設為 update buff_test set col2='cde' where id=3;), 根據SQL語句的執行計劃,相關的數
據塊被讀入buffer cache, Oracle都會抽取資料塊的頭部,在記憶體中構建buffer header, 並將這些buffer header
串成連結串列,而buffer header裡面記錄的指標就指向buffer cache中的該資料塊本身。 於是Oracle在buffer cache
中搜尋某個資料塊時,就不用buffer cache中找,而是直接掃描連結串列上該資料塊所對應的buffer header, 然後根據
buffer header所記錄的指標就能在buffer cache中直接定位該資料塊了。


在library cache中,SQL文字轉化為ASCII碼,然後使用hash演算法計算出對應的hash value.
在buffer cache中,Oracle抽取buffer cache的資料塊的頭部,在記憶體中構建buffer header, 然後對buffer header
中記錄的資料塊地址和資料塊型別運用hash函式,得到該資料塊所屬的組號(hash bucket)。


hash bucket      buffer header                  buffer cache   
[0]  ---------&gt  [xxx]           --------&gt 每個buffer header中的指標指向buffer cache中的該block本身。
[1]  ---------&gt  [xxx]--&gt[xxx]   --------&gt (這裡是兩個指標指向...)
[2]  ---------&gt  [xxx]--&gt[xxx]  
[3]  ---------&gt  [xxx]
[4]  ---------&gt  [xxx]--&gt[xxx]
[5]  ---------&gt  [xxx]--&gt[xxx]--&gt[xxx]  --------&gt (這裡是三個指標指向...) 

備註:  上面的buffer header部分的箭頭連結串列被稱為hash chain . 


當前臺發出SQL語句,Oracle根據執行計劃找到符合條件的資料塊(資訊),然後Oracle會根據對請求的資料
塊的地址以及資料塊的型別做為引數,應用hash函式運算,得到要找的資料塊所處的hash bucket, 也就是決定資料
塊在哪條hash chain上,然後Oracle進入該hash chain,從上面所掛的第一個buffer header開始,根據buffer
header 指標找到資料塊體,掃描其中資料,確認是否是SQL語句需要的塊,如果是,則返回該塊所需要的資料;
否則繼續向下搜尋直到最後一個buffer header為止,如果一直都沒有找到,則呼叫物理I/O, 到磁碟上資料檔案
上把該塊所含有的內容複製一份到一個可用的buffer裡,同樣構建該塊的buffer header, 然後根據hash值將buffer
header 掛到hash chain上去。

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

相關文章