openGauss - 向量化执行引擎算子HashAgg解读

举报
Gauss松鼠会小助手 发表于 2024/08/06 11:12:58 2024/08/06
【摘要】 对于分组聚合来说,可以通过排序将待排序值按照大小排列起来,相同的值就紧密连在一起,然后依次遍历,遇到不相同的值就得到一个分组。另一种方式是通过Hash来完成,将所有值都构建到hash表中,同一个桶的值即为一个分组(hash冲突的场景忽略)。openGauss的向量化执行引擎如何通过Hash来实现聚合?

本文作者:闫宗帅

对于分组聚合来说,可以通过排序将待排序值按照大小排列起来,相同的值就紧密连在一起,然后依次遍历,遇到不相同的值就得到一个分组。另一种方式是通过Hash来完成,将所有值都构建到hash表中,同一个桶的值即为一个分组(hash冲突的场景忽略)。openGauss的向量化执行引擎如何通过Hash来实现聚合?

1、HashAggRunner类

HashAggRunner类是Hash Agg执行的对象,主要成员及其关系如下图所示:

4a0d70589eac770678179102e1ac2cbe_20240707-bc148476-2888-4102-bbe9-2ec7bdadb6e3.png

1)m_hashVal[]:数组大小是batch大小,存储着batch每行hash列的hash值:

ab8db57eb325d423080896dfb3f213da_20240707-f5d92407-0e90-4259-bc2c-7804cde72988.png

1)Hash表由m_hashData管理,hash表数据都在内存则总是使用m_hashData[0],由两个成员组成:tbl_size为hash表大小,tbl_data为hash表

2)tbl_data[]为hash表,hash表存储hashCell*指针。也就是每个分组的值放到这里。Hash表的大小就是分组数:

ffabbfe46cf660e074c8c0193d2d4a70_20240707-0fa75d02-ada2-4229-84b0-8ab6dde59f30.png

该分组数是根据work_mem和以及统计信息估算出来的。

1)m_cacheLoc[]数组存储每行记录的hash桶号,计算方法:m_hashVal[i] & (m_hashSize - 1)。可以看到,不同值肯定会存在放在同一个桶的情况。

2)m_Loc[]数组存放hashCell,而hashCell则表示每个分组值,当发生hash冲突时,以链表的形式挂载同一个桶上。

3)HashAgg分组聚合的计算方式:这里忽略hash冲突的场景

比如有一列值:

32841faa40f5a72059e7ff150fe3eb2c_20240707-c4d21b44-b279-4d38-9abc-22b2a8de165d.png

依次:第一行1hash后放到桶1,然后将1的cell放到m_Loc[0];2放到m_Loc[1];1hash到桶1,使用桶1的cell,将其放到m_Loc[2];3放到m_Loc[3];2的cell存放到m_Loc[4]。那么m_Loc[]数组依次存储的cell为:

00f15b264758b855b2579075c1bed400_20240707-bf4ce9c7-46f5-4897-bc81-71ce00f96c98.png

这样将m_Loc[]数组带入向量化计算函数中,对其进行聚合,比如count:

for( i < nrows ){
   m_Loc[i].cell++;
}

2、流程

f4d5d9b81be8512fd9c8dd21b508aede_20240707-556c2c35-6e71-4007-84c6-3a5b3b0bb0aa.png

1)HashAggRunner::Run函数是向量化HashAgg操作入口函数,Build函数用于构建hash表并进行聚合;Probe函数用于构建聚合输出结果

2)构建hash表的具体函数为HashAggRunner::buildAggTbl,对于hash冲突的值以链表的形式挂载同一个桶上,总是向链表头插入;构建的过程中进行分组聚合时,需要进一步调用函数match_key在链表上进行匹配

3)HashAggRunner::Probe函数用于将cell值即hash表中的值构建到输出结果batch中,中间若有QUAL条件,则需要过滤后投影输出。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。