oracle逻辑读过程

来源:这里教程网 时间:2026-03-03 19:05:18 作者:

一个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内核技术揭秘_吕海波中理解

相关推荐