一. 前言
本文主要通过代码走读讲述openGauss中聚合算子的实现过程。
在openGauss中,聚合分成两种,一个是简单聚合,比如对数据进行count等操作,另外一个是Hash聚合,先要对数据进行Hash分类,再对同类的数据进行聚合,如group by聚合。
二. aggtransfn、aggcollectfn、aggfinalfn 函数
openGuass中,在注册aggregate的时候需要提供aggtransfn,aggcollectfn和aggfinalfn 函数,分别对应对于每一行输入的处理函数,多个线程的收集函数和最后的聚合参数。以avg函数为例,aggtransfn,aggcollectfn和aggfinalfn分别对应int4_avg_accum,int8_avg_collect和int8_avg函数,其作用分别是对每行输入求和,对每个线程求和和求取平均值的功能,openGuass的聚合操作过程中会回调上述的函数完成聚合计算,如下以avg的聚合函数讲述回调过程。
三. avg聚合函数的代码走读
如下为avg函数的执行代码流程为例了解openGauss中是如何实现聚合操作的,聚合算子的入口函数为ExecAgg。
ExecAgg // 执行聚合函数的入口
agg_retrieve_direct
for (;;) { // 遍历所有的输入元组
outerslot = fetch_input_tuple(aggstate); // 获取当前元组
advance_aggregates(aggstate, pergroup); // 逐行进行聚合