data buffer header和bucket chain以及它的算法缘由

 cache buffer chain(hash chain) 和 cache buffer bucket (hash bucket)来源:

对于Buffer cache管理而言 oracle所需要 解决的问题包括 几个:

1.  如何 快速定位一个data buffer header,因为 Buffer cache中的 data buffer header 是非常多的 , 若为了找一个data buffer header 而去 对所有的 buffer header都 扫描一遍 ,那将是非常低效的。

举个例子来说 服务进程要 有读取 datafile 5 block 10的需求 , 这个时候 难道服务进程 一开始就知道 data file 5 的 block 10在   是不是在 Buffer cache中,  在Buffer cache中的哪里? 这些信息 Server process都是不知道的。

如果 data buffer header被 使用 普通的双向链表组织,那么 如果要确定一个 data buffer是否在 Buffer Cache中,那么需要把 这个双向链表上所有的buffer header都查看一遍, 这是十分低效的。

2.  对 data buffer header 高效的并发管理 ,避免出现 争用。 
为了 实现 高效管理 data buffer header的目的 , oracle 使用 hash buckets的结构来 组织 data buffer header, 通过对 data buffer header 的 不同 rdba 和 class 做HASH 算法 来实现 对 buffer header的高效管理,  通俗来说 HASH做的就是一件事  ,  例如 data file 4 上的 block 18 和 block 19是 应用经常要访问的热快, 经过HASH算法之后 这2个块 就不会落在同一个HASH Buckets中,这样避免了对 同一条hash chain的争用。    


oracle又通过  hash chains( cache buffer chain) 将一个bucket 上的buffer header串起来 ,  注意 同一个data block在oracle中可能会有 多个buffer , 分别对应为一个 current block 和可能的多个 cr block, 这些block都同一条 cache buffer chains上。


为了实现 对cache buffer chains的并发控制 需要用到 latch来管理 , 所以会有 cache buffer chains latch。

CBC 的latch管理是 Buffer cache Internal的主要部分,值得研究 但是并非 一段文字所能全部描述。

你也可以参考下面 这个图示:

但是 因为 HASH algorithm  对于 Block的RDBA+CLASS 的散列作用, 相邻的数据块(neighborhood block)会尽可能分在 不同的bucket内。

可以看一下 同一个 table object的 buffer header在 同一个 hash bucket中的情况, 可以看到 这些同一个hash bucket 中的BH 总是在物理上 那样疏远


说2个块 不在同一个 hash chains 就不会造成cbc latch争用 是不准确的,  上面的说明中 这样解释 是为了容易理解。  实际 一个cache buffer chains latch 会管理多个 cache buffer chain ,所以若 2个 data buffer header 恰好在 同一个 cbc latch 管理的 hash chains上的话 还是有可能造成 contention 。  但是 hash fun 会尽可能让  相邻块(neighborhood block) 分布在不同 latch 管理的 hash chains上。


----------------这篇讲从磁盘块出发到内存中的buffer的过程,及latch在多个bucket间共享,这里bucket到底是利用内存中rdba+class散列算法生成hash值分组到对应bucket中,还是根据块的大小分配到不同的bucket中,shared pool的freelist只在从磁盘向内存读数据块时才使用,从应用角度搜寻内存中的buffer不使用freelist吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值