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,通过:
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。