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函数的执行逻辑是:首先准备数据(从子节点获取数据),然后向哈希表中填充中间计算结果。

posted @ 2024-04-30 10:50  openGauss-bot  阅读(9)  评论(0编辑  收藏  举报