openGauss源码解析(124)
openGauss源码解析:执行器解析(17)
4. Group算子
Group算子用于处理GROUP BY子句(节点),对满足条件的元组做分组处理,对应的代码源文件是“nodeGroup.cpp”。Group算子对应的子节点返回的元组是按照分组属性排列的结果。算子对应的主要函数如表7-27所示。
表7-27 Group算子主要函数
主要函数 | 说明 |
---|---|
ExecInitGroup | 初始化Group状态节点 |
ExecGroup | 迭代获取元组 |
ExecEndGroup | 清理Group状态节点 |
ExecResScanGroup | 重置Group状态节点 |
ExecInitGroup函数初始Group状态节点。主要执行流程如下。
(1) 构造Group状态节点。
(2) 初始化目标表达式和过滤表达式。
(3) 初始化唯一子节点(用于输出元组)。
(4) 获取唯一值过滤函数。
ExecGroup函数输出分组后的元组。Group子节点输出的元组已按照分组属性排序,在迭代输出时只要发现同上一个元组属性不匹配,则生成新的元组(新分组)输出。
5. Agg算子
Agg算子用于执行含有聚集函数的操作,对应的代码源文件是“nodeAgg.cpp”。Agg算子支持3种策略处理:普通聚集(不分组聚集计算)、排序聚集、哈希聚集。排序聚集和哈希聚集计算都包含GROUP BY子句而不分组聚集计算则不包含。普通聚集实际可以看作分组聚集的一种特例(每个元组对应一个分组)。普通聚集与排序聚集使用agg_retrieve_direct函数获取元组,哈希聚集使用agg_retrieve函数获取元组。算子对应的主要函数如表7-28所示。
表7-28 Agg算子主要函数
主要函数 | 说明 |
---|---|
ExecInitAgg | 初始化Agg状态节点 |
ExecAgg | 迭代获取元组 |
ExecEndAgg | 清理Agg状态节点 |
ExecResScanAgg | 重置Agg状态节点 |
ExecInitAgg函数用于初始化Agg状态节点。主要执行流程如下。
(1) 构建AggState状态节点。
(2) 计算最大分组数(迭代阶段)。
(3) 初始化子计划节点(左子节点)。
(4) 初始化聚合函数。
(5) 初始化罗盘文件。
ExecAgg函数输出聚合元组。从子节点(子计划执行)获取元组,按照指定的属性列聚合,根据不同的聚合调用agg_retrieve或agg_retrieve_direct函数。agg_retrieve函数的执行逻辑是:首先准备数据(从子节点获取数据),然后向哈希表中填充中间计算结果。