hybrid hash join

hybrid hash join是基于grace hash join 的优化。
在postgresql中的grace hash join 是这样做的:inner table太大不能一次性全部放到内存中,pg会把inner table 和outer table按照join的key分成多个分区,每个分区(有一个inner table子部分也有一个outer table的子部分)保存在disk上。再对每个分区用普通的hash join。每个分区称为一个batch,通过join key计算出hash value,然后计算出对应的batchNo与BucketNo:计算公式如下:

bucketNo = hash value % nbuckets;
batchNo = (hash value / nbuckets) % nbatch;
//nbuckets为buckets的个数,nbacth为batch的个数。

大致上和mysql差不多,不过mysql并没有分buckets。
判断是否需要多个batch的逻辑如下:
若 inner table的size + buckets的开销 < work_mem,使用单个batch。否则使用多个batch:

plan_rows:预估的inner table的行数
plan_width:预估的inner table的列数
NTUP_PER_BUCKET:单个buckets的tuple数据
Work_mem:为hashjoin分配的内存配额

hybrid hash join的优化在于:对于第一个batch不必写入disk,从而避免第一个batch的磁盘IO

具体过程如下:
1、首先对inner table进行分区/分batch,计算batchNo:
如果该tuple属于batch0,则加入内存中的hashtable中;
否则写入batchNo对应的disk file中。
总结就是batch0不用写如磁盘(当然也有例外,在下文会提到)
2、对outer table进行分区/分batch,计算batchNo:
如果tuple属于batch0,那么用key去内存hashtable寻找(equal_range or find),匹配则输出,否则继续读下一行probe tuple。
否则写入batchNo对应的disk file中。
3、outer table扫描完毕,batch0也处理完了。
开始按照No处理下一个batchx:
加载batchx的inner table到内存,build hash table
扫描batchx的outer table,进行probe。
batchx处理完,处理batchx+1,直到所有batch都处理完毕。

现在还有一个问题:如果分割后的batch0仍然太大,不能一次性放到内存中,怎么办?
postgresql的做法是将batch个数翻倍,从原本的n变为2n。重新扫描batch0的tuples,根据nbatch = 2n,重新计算所属的batch。如果重新计算后的batcth仍然属于batch0,就保留在内存中,否则从内存中拿出,写入到tuple对应的新batch中。
(此时batch0的后半部分数据被分配到batchn上)

注意,此时不会移动磁盘中batch file中已有的tuple,当处理到该batch的时候会处理。
还记得上文提到的hybrid hash join的取模操作吗?这个操作保证了,batch数目翻倍后,tuple所属的batch只会向后扩展。
刚刚说的只是batch0,当我们继续处理batch_i的时候,可能还是会遇到这个问题。那么就继续将nbatch数目翻倍吧!
当然tuple所属的batchNo也会变化。

Postgresql中的hybrid hash join(无状态机讲解)相关推荐

  1. Mysql 优化器内部JOIN算法hash join On-Disk Hash Join Grace Hash Join Hybrid hash join过程详解

    Mysql 各种hash join算法讲解 hash join的概述 提到hash join之前自然得说Nest loop join,以两个表的关联为例,它其实是个双层循环,先遍历外层的表(n条),再 ...

  2. 循序渐进丨MogDB Hash join实现

    点击蓝字 关注我们 Join有三种实现算法:Nested Loop.Merge Join.Hash join.他们各有优缺点: Nested Loop通常性能不好,但适用于任何类型的join: Mer ...

  3. Mysql 优化器内部JOIN算法hash join Nestloopjoin及classic hash join CHJ过程详解

    Mysql hash join之classic hash join CHJ过程详解 hash join的历史 优化器里的hash join算法在SQL Server.Oracle.postgress等 ...

  4. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  5. sparksql中shuffled hash join策略

    背景 sparksql中又很多join策略,其中有一个是shuffled hash join.这个用的比较多,但是又说不明白其原理,我各种百度,各种谷歌,最后在stackoverflow找到了一份资料 ...

  6. MySQL 8.0 新特性:引人注目的哈希连接(Hash Join)

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:r6d.cn/uATq MySQL 开发组于 2019 年 10 月 ...

  7. MySQL 8.0 新特性之哈希连接(Hash Join)

    MySQL 开发组于 2019 年 10 月 14 日 正式发布了 MySQL 8.0.18 GA 版本,带来了一些新特性和增强功能.其中最引人注目的莫过于多表连接查询支持 hash join 方式了 ...

  8. SQL优化(一) Merge Join vs. Hash Join vs. Nested Loop

    本文介绍了Merge Join,Hash Join,Nested Loop这三种数据库Join方式的工作原理,并通过实验进一步说明了其适用范围. 原创文章,转载请务必将下面这段话置于文章开头处(保留超 ...

  9. [译]以PostgreSQL为例,谈join计算的代价

    join计算的代价很高吗? 看情况 join的代价依赖于join的条件,索引是什么样,依赖于表有多大,相关信息是否已经cache住了,使用的什么硬件,配置参数的信息,统计信息是否已经更新,同时是否还有 ...

最新文章

  1. 加速产业生态算力升级,华为鲲鹏展翅福州
  2. Xcode 中的IOS工程模板
  3. 6.4高级查询:分组查询 链接查询 子查询 联合查询
  4. 最新 MSDN Library for Visual Studio 2008 SP1
  5. Slim Span UVA - 1395
  6. GetGeneratedKeysHelper 与反射
  7. java 如何将word 转换为ftl_使用 freemarker导出word文档
  8. Converter Tutorial
  9. pushViewController自定义动画http://blog.csdn.net/ralbatr/article/details/22039233
  10. 动态网页抓取数据软件
  11. 谈谈我们为什么要前后端分离
  12. 【有问不答】一维信号临界采样/过采样/欠采样,并利用插值公式恢复信号(MATLAB)
  13. Jenkins 身份验证及授权简介
  14. cocos Uncaught Download text failed 错误解决
  15. 一位全加器 VHDL设计与实现
  16. <Zhuuu_ZZ>HIVE(终)总结大全:是兄弟就来三连我
  17. 小鸡农场种植小游戏开发
  18. 怎么运行php格式的文件
  19. android 苹果日历提醒功能,一日一技 | 在 iOS 和 Android 之间同步日历、联系人和提醒事项...
  20. 传输加载优化(资源压缩、资源缓存、HTTP2)

热门文章

  1. java定义list_我的Java Web之路59 - Java中的泛型
  2. js替换数组中字符串实例
  3. 如何在Hexo中实现自适应响应式相册功能
  4. 行内元素和块级元素的区别
  5. jQuery(一)初识
  6. iOS-----------关于组件化
  7. JavaScript封装方法,兼容参数类型为Number和String
  8. string 大小写转换
  9. UITableViewCell 选中的状态小技巧
  10. Azure Virtual Network, 虚拟网络