前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GreenPlum Hash聚合简析

GreenPlum Hash聚合简析

作者头像
yzsDBA
发布2022-12-27 13:52:13
3220
发布2022-12-27 13:52:13
举报

GreenPlum Hash聚合简析

Hash聚合相关结构体

首先需要了解Hash表是什么结构?该Hash表在哪个结构里进行管理?如何和聚合算子的结构联系起来?

从下图可以看到:

1)Hash表位于:AggState聚合算子状态描述结构的perhash中,即hashtable。

2)hash表的hash函数由perhash->hashfunctions进行描述,其实是个二维数组指针,包含每个hash列的hash函数描述。

3)Hash函数的OID来自Agg结构体的grpOperators数组。Hash探测中的比较函数的OID是eqfuncoids,通过:

代码语言:javascript
复制
BuildTupleHashTable->BuildTupleHashTableExt->ExecBuildGroupingEqual

将eqfuncoids转换 成计算步骤tab_eq_func。

4)Hash表的hash桶是TupleHashEntryData* data。Key值通过hash函数hash后与sizemask进行与操作,结果为数组下标。也就是定位到哪个hash桶。

5)Hash桶结构体中包含:MinimalTuple firstTuple,也就是每个分组的第一个值。而additional即AggStatePerGroupData结构的指针,保存每个分组的聚合计算中间值。

6)每次聚合计算时,从下层节点拿到一个tuple,然后通过hash映射到对应的hash桶。拿到对应的AggStatePerGroupData,将其赋给AggState中的hash_pergroup。将hash_pergroup带入聚合计算函数,将计算结果保存到hash_pergroup中。这样就完成了分组聚合。

实例解析

比如,一组数组:1 1 2 2 3 3进行count

1)拿到第一个1,经hash函数映射后得到data[1],该桶下的additional为开始为空,此时申请一个AggStatePerGroupData空间,并放到additional下。

2)将该AggStatePerGroupData地址给了AggState的hash_pergoup。

3)将hash_pergoup带入聚合计算函数中,transValue由Datum转换成数值后加1

4)接着拿到第二个1,同理,得到data[1],此时他的additional已经有AggStatePerGroupData,将其付给hash_pergoup带入聚合计算函数中进行计算。计算后transValue为2。也就是1的个数是2

5)同理,计算2和3这个两个分组。分别得到3个分组:1的个数是2,2的个数是2,3的个数是2。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hash聚合相关结构体
  • 实例解析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档