pg hashjoin 节点大致步骤:
1、分块与分桶。对一个表hash时,确定块数和桶数量。(一块被划分为10个元组的桶)确定分块号与分桶号是由hashvalue决定的。
2、执行:
- 1、顺序获取S表中所有元组,对每一条元组Hash,获取块号和桶号,块号为0,放入内存桶中。
否则放入S表建立的临时文件中。
标记内存中块号curbatch = 0 - 2、从表R中获取元组,进行Hash,获取元组块号和桶号。
当块号 = 当前内存块号,直接扫描对应桶,寻找满足条件的元组并进行连接。
否则放入为表R建立的临时文件中(每个块都有一个)
一直执行,直到R扫描完毕。 - 3、从S表中,块号为curbatch+1对应的临时文件中读取所有存储的元组,将其hash到对应桶内,curbatch++。
- 4、从R表块中,块号为curbatch对应临时文件读取所有存储元组,并计算桶号,并扫描桶中S,寻找满足连接条件的tuple。
build hash table
pg11,buildhashtable阶段:
1、每个worker并行扫描部分inner_table。
2、在共享内存中并行build一个hash表
3、每个worker并行地扫描outer_table,并行执行join probe操作
需要注意的是,在join之前,需要通过barrier机制,先完成自己build操作的线程需要等待hashtable被完整build后才能进入下一步的probe状态。
multipleBatch的probe与hash
1、并行扫描inner_table,属于batch0的tuple在内存中构建一个shared hash table;不属于这个batch的写入对应batch的inner tuple文件中
2、并行扫描outer_table,写入对应batch的outer_tuple文件。
3、并行地对batch0执行join
4、某些workers先完成batch0地join后,分别领取后续batch的join任务。
状态机
对于正在处理某个batch的worker来说
1、若没有build完成,且有其他worker加入进来,则一起并行build hash table,在join之前必须barrier同步
2、若build完成,无需barrier
3、在barrier相关的module中,每个worker加入执行attach时,barrier中维护计数,在需要等待的地方判断计数是否归零。
参考
https://zhuanlan.zhihu.com/p/112003245