oracle核心原理-讀取buffer解析
阿新 • • 發佈:2020-01-22
1 搜尋buffer過程如下:
- 根據要訪問的檔案號,塊號,計算hash值。
- 根據hash值,找到對應的bucket。
- 搜尋(在CBC的保護下) bucket的連結串列,查詢哪個 BH為目標BH.
- 找到對應的BH,開始修改buffer pin鎖,完成後釋放CBC。
- 在buffer pin鎖保護下,讀取BA。
- 按照BA訪問buffer
以上為oracle邏輯讀過程,如果未找到,則需要發生物理讀取。
2 持有CBC完成工作
- 搜尋連結串列,查詢目標BH。
- 修改BH中buffer pin鎖狀態,
- 釋放cbc,在buffer pin保護下訪問buffer
- cbc的主要核心作用為保護連結串列和保護BH,
buffer pin鎖有多重模式,共享(S),獨佔(X),沒加鎖則為0。
如果只是邏輯讀,則修改buffer pin為S模式,如果是DML則需要修改為X模式。
3 一個邏輯度過程
- 全表掃描讀取extent map或者索引掃描(讀取段頭+1=根塊,枝塊,葉塊讀取rowid)得到file#和block#。
- 根據file#和block#進行hash運算,得到對應的bucket。
- 獲取cbc,檢索hash 連結串列,搜尋資料塊,查到後,修改對應bh的buffer pin狀態,從0-S或者從0-X,
- 釋放cbc,在buffer pin鎖保護下,根據BH中對應的BA讀取buffer內容。
- 讀取完buffer後,獲取cbc,將buffer pin狀態恢復到0.
- 釋放CBC。
- 如果對應的BH未找到,則進行物理讀取。物理讀取對應的buffer狀態為read。