Build Hash Table流程
- 1、初始化
row buffer
- 2、从
build input table
中读一行 - 3、若读完
build input table
所有row,返回状态READING_ROW_FROM_PROBE_item
- 4、否则,向
hash map
中写入一条row - 5、如果
hash map
写入成功,返回2,继续执行 - 6、若
hash map
满了,则写chunk file
- 1、初始化
chunk file
- 2、将剩余的row写入
chunk file
- 3、返回状态
READING_ROW_FROM_PROBE_item
流程图如下:
- 1、初始化
Write Rows to chunks流程
- 1、从
input
表(build 或者 probe)读row - 2、写入
chunk file
- 1、构造
join key
- 2、计算
hash key
并选择chunk file
- 3、写入相应的
chunk file
中
流程图如下:
- 1、构造
单线程hash join 步骤
step1:初始化
- build table init
- memory buffer init
- create hash map
- probe table init
- state 设为
Reading_Row_From_Probe_Iterator
step2:HashJoinIteratorRead,根据state做调整
-
(1)、state为
Reading Row from probe iterator
- 1、从
probe table
read一行row - 2、如果所有
probe input row
都读完了- 如果非
spill to disk
,对build input
剩余的row构造hash map
,重新对probe
表做init,回到1继续 - 如果为
spill to disk
,goto(2)
- 如果非
- 3、如果
build input
有chunk file
,将probe input
表写入chunk file
- 4、从
hash map
里查找probe input
row的查询结果 - 5、goto(4)
- 1、从
-
(2)、state为
Loading next chunk pair
- 找到下一对
chunk pair
做hash join
- 找到下一对
-
(3)、state为
Reading row from probe input file
,读一个probe chunk
的row做hash join
- 1、从
probe chunk
读一行row - 2、在
hash table
里查询匹配 - 3、goto(4)
- 1、从
-
(4)、state为
Reading from hash table
,读取hash table
中匹配记录- 1、将查到的
row buffer
写入build input
表的record[0]
中 - 2、若读取完
hash table
中记录,goto(1)或者(3)
- 1、将查到的
状态流程图: