GreenPlum Hash聚合简析
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。
相关文章
- 枚举法中利用hash思想进行优化
- MySQL: Hash索引优缺点
- hash算法和hash一致性_分布式一致性hash
- Redis五大数据类型之Hash操作命令
- ORA-22877: invalid option specified for a HASH partition or subpartition of a LOB column ORACLE 报错 故障修复 远程处理
- ORA-27242: ELF file has invalid hash table entry size ORACLE 报错 故障修复 远程处理
- Redis基本数据类型哈希Hash常用操作命令
- RedisTemplate常用操作方法总结(set、hash、list、string等)
- Redis学习之Redis Hash类型及操作详解程序员
- Oracle 视图 USER_CLUSTER_HASH_EXPRESSIONS 官方解释,作用,如何使用详细说明
- Oracle 参数 HASH_AREA_SIZE 官方解释,作用,如何配置最优化建议
- MySQL分区:使用Hash法优化查询效率(mysql分区hash)
- 使用Mysql把大表Hash分表(mysql分表hash)
- Exploring Redis Hash Tables: A Comprehensive Guide to Effective Data Storage and Retrieval(redishash表)
- Redis集群Hash:优化大量数据存储和高效查询的解决方案(redis集群hash)
- 了解MySQL中Hash索引的特点和使用方法(mysql中hash索引)
- 查看Redis中Hash数据类型的实际应用(查看redis hash)
- Oracle数据库中的Hash索引与实例分析(hash索引oracle)
- Redis中获取高性能的Hash值(redis里获取哈希值)
- Redis的Hash表遍历指南(redis遍历hash表)
- Redis实现Hash表遍历技术研究(redis遍历hash表)