当前位置: 首页 > news >正文

详解Oracle HASH CHAIN和HASH BUCKET

服务器进程将数据块读取至BUFFER CACHE之后,会将数据块的DBA(Data Block Address)进行简单的HASH函数计算,并将所有具有相同HASH值的数据块挂载至同一个HASH BUCKET下,同时还会用HASH CHAIN串联起来。因此,利用这种算法,Oracle只要通过计算数据块的HASH值就可以快速定位数据块应该属于哪一条HASH CHAIN,然后定位该数据块。
CR(Consistent Read)块指的是当前数据块和UNDO中的前映像数据整合的数据块。由于同一个数据块的CR块都具有相同的DBA值,所以它们都挂载在同一条HASH CHAIN中。如果过多的CR块驻留在BUFFER CACHE将会导致HASH CHAIN过长,从而增大出现HASH CHAIN争用的概率,所以Oracle设置一个隐含参数_db_block_max_cr_dba,用于限制CR块数量(默认情况下,不能超过6个),通过这种方法在某种程度上减小了HASH CHAIN冲突的概率。Oracle 10g以上版本中,一条HASH CHAIN中一般不会存在很多BLOCK。可以通过以下查询判断系统中是否存在过长的HASH CHAIN:
select hladdr, count(*) from xKaTeX parse error: Unexpected character: '' at position 316: …量,需同时满足以下两个条件: ̲调整BUFFER CACHE的…sgainfo where NAME=‘Buffer Cache Size’;
如果数据块大小为16KB,那么该BUFFER CACHE可大致存放5262336个BLOCK BUFFER,如下所示:
SQL> select 86218113024/16384 from dual;
根据Oracle 10g HASH BUCKET数量的算法,大于2倍db block buffer数量的最小的2的幂次的数值应该是16777216(2的24次方),这个计算值和该数据库中的隐含参数_db_block_hash_buckets值相同。如果要通过修改BUFFER CACHE大小来自动调整HASH BUCKET的数量,那么BUFFER CACHE的大小至少要调整为16777216/2×16384=128GB,然后重启数据库。
注意 为简单起见,以上计算过程没有包含BUFFER HEADER的大小,所以在实际调整过程中,BUFFER CACHE的值要比计算出来的值略大。

相关文章:

  • PostgreSQL基本用法
  • 数据分析入门指南:从历史到实践
  • Linux详解基本指令(一)
  • HttpMessageConverter 的作用是什么? 它是如何实现请求体到对象、对象到响应体的自动转换的(特别是 JSON/XML)?
  • # YOLOv4:目标检测的全新突破
  • 特种作业操作证考试题库及答案(登高架设作业)
  • 【数据库】数据库故障排查指南
  • C++初阶-vector的底层
  • 计算机组织原理第一章
  • Android 11.0 动画缩放默认值改为0.5的功能实现
  • Spring Boot 接口定义指南:构建高效的RESTful API
  • 【工具使用】STM32CubeMX-片内Flash读写操作
  • 深入解析 Oracle session_cached_cursors 参数及性能对比实验
  • Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决
  • Linux-进程间通信
  • (C语言篇)处理字符串的四个基础函数
  • 一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(下)
  • Navicat连接开启sm3认证的瀚高数据库
  • 关于摄像头模块的红外截止滤光片
  • C++-演讲比赛项目
  • 世卫大会再次拒绝涉台提案,国台办:民进党当局再遭挫败理所当然
  • 第1现场|俄媒称乌克兰网上出售北约对乌军培训手册
  • 新华社千笔楼:地方文旅宣传应走出“魔性尬舞”的流量焦虑
  • 以色列总理:以哈谈判内容包括“结束战争的框架”
  • 聚焦中华文明精神标识,多校专家学者跨学科对话交流
  • 体坛联播|水晶宫队史首夺足总杯,CBA总决赛爆发赛后冲突