oracle邏輯讀過程

wanglinghua0907發表於2023-12-26

一個CBC latch管理多個bucket,根據hash找到bucket,不存在遍歷完這個CBC latch的BH去下個CBC latch的現象

Buffer cache中hash bucket的數量由_db_block_hash_buckets引數設定。


宏觀

1.根據要訪問的檔案號、塊號,算出hash值

2.根據hash值找到hash bucket

3.根據每個hash bucket獨有的一個 指向CBC連結串列(cache buffers cache chains list)的連結串列頭(我願稱之為指標),找到對應的CBC連結串列

4.CBC連結串列就是一堆hash值相同的BH(buffer header)組成的,搜尋CBC連結串列=遍歷一個個BH

5.找到目標BH,提取其中的BA(buffer address),BA記錄塊在buffer cache中的地址

6.根據BA訪問buffer(此處buffer指記憶體中的一個單位)

CBC連結串列

1.CBC連結串列是雙向連結串列,互相指向,a互相b   b互相a和c,等等,同個列表中的BH的hash值是一樣的。

2.每個bucket都有一個CBC連結串列

3.每個BH大小相同

4.逐個比對BH中的檔案號、塊號,直到找到目標BH

更加微觀一點

1.根據要訪問的檔案號、塊號,算出hash值

2.根據hash值找到hash bucket

3.根據每個hash bucket獨有的一個 指向CBC連結串列(cache buffers cache chains list)的連結串列頭(我願稱之為指標),找到對應的CBC連結串列

4.從CBC連結串列的連結串列頭——CBC連結串列,中間的CBC latch鎖設成X模式(獨佔鎖)

5.CBC連結串列就是一堆hash值相同的BH(buffer header)組成的,搜尋CBC連結串列=遍歷一個個BH

6.在CBC latch鎖的獨佔保護下,找到想要的BH,此BH中的buffer pin鎖從0轉變為S(共享鎖)

7.buffer pin鎖修改完成,釋放獨佔的CBC latch鎖。

8.提取其中的BA(buffer address),BA記錄著塊在buffer cache中的地址

9.根據BA讀取buffer中的資料(此處buffer指記憶體中的一個單位)

10.讀完buffer資料後,buffer pin鎖改為0



本文從Oracle核心技術揭秘_呂海波中理解

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

相關文章