oracle数据库内核管理-数据块读取与写入

Oracle读取或修改数据块的流程:

一.(读操作)非唯一索引方式,非索引根块和分支块

  1. 对要访问的块地址做HASH

HASH(FILE#,BLOCK#) = hash_value(HV)

  1. 根据HV找到对应的HASH bucket

  2. 以独占方式申请管辖此bucket的CBC latch

  3. 搜索bucket中的HASH chain链表,比对chain上的buffer_header(BH),找到目标BH

  4. 修改BH中的buffer pin锁为S(share)模式(之前为0,无锁)

  5. 释放CBC latch.

  6. 根据BH中的BA指针找到buffer

  7. 读取buffer中的数据到PGA中.

  8. 以独占方式申请管辖此bucket的CBC latch

10.修改BH中的buffer pin锁为0(无锁)模式
11.释放CBC latch

二.(读操作)唯一索引方式所有块,非唯一索引根块和分支块

  1. 对要访问的块地址做HASH

HASH(FILE#,BLOCK#) = hash_value(HV)

  1. 根据HV找到对应的HASH bucket

  2. 以共享方式申请管辖此bucket的CBC latch

  3. 搜索bucket中的HASH chain链表,比对chain上的buffer_header(BH),找到目标BH

  4. 根据BH中的BA指针找到buffer

  5. 读取buffer中的数据到PGA中

  6. 释放CBC latch

三.(写操作)

  1. 对要访问的块地址做HASH

HASH(FILE#,BLOCK#) = hash_value(HV)

  1. 根据HV找到对应的HASH bucket

  2. 以独占方式申请管辖此bucket的CBC latch

  3. 搜索bucket中的HASH chain链表,比对chain上的buffer_header(BH),找到目标BH

. 5. 修改BH中的buffer pin锁为X(exclusive)模式(之前为0,无锁)

  1. 释放CBC latch

  2. 根据BH中的BA指针找到buffer

  3. 产生redo数据

  4. 修改buffer中的数据.

  5. 以独占方式申请管辖此bucket的CBC latch.

10.修改BH中的buffer pin锁为0模式

11.释放CBC latch.

猜你喜欢

转载自blog.csdn.net/oradbm/article/details/109614606