ITPub博客

首页 > 数据库 > Oracle > oracle逻辑读过程

oracle逻辑读过程

原创 Oracle 作者:wanglinghua0907 时间:2023-12-26 16:52:24 0 删除 编辑

一个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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE、sql server、oceanbase数据库专家,拥有7年以上的大型数据库运维经验,主方向oracle,擅长故障排除、诊断,大体量(TB)迁移,异常故障修复等。拥有丰富主导大型项目经验。服务行业包括:运营商、银行、金融业、政府单位、医疗、制造业、高校等等。

注册时间:2020-07-31

  • 博文量
    116
  • 访问量
    88805