openGauss源码解析(115)

openGauss源码解析:执行器解析(8)

4. BitmapOr算子

BitmapOr节点同BitmapAnd节点类似,主要差异是BitmapAnd对子计划结果做求交计算(tbm_intersect),而BitmapOr是对子计划结果做并集计算(tbm_union)。BitmapOr算子提供的主要函数如表7-9所示。

表7-9 BitmapOr算子主要函数

主要函数

说明

ExecInitBitmapOr

BitmapOr节点初始化

MultiExecBitmapOr

获取Bitmap节点

ExecEndBitmapOr

关闭BitmapOr节点

ExecReScanBitmapOr

重新扫描BitmapOr节点

5. RecursiveUnion算子

RecursiveUnion算子对应的代码源文件是“nodeRecursiveUnion.cpp”,用于递归处理UNION语句。

下面给出一个例子,用SQL实现1到10递归求和,语句如下:

/* 递归求和 */

WITH RECURSIVE t_recursive_union(i)AS(

VALUES (0)

UNION ALL

SELECT i + 1 FROM t_recursive_union WHERE i < 10)

SELECT sum(i) FROM t_recursive_union;

/* 查询计划 */

Aggregate

CTE t_recursive_union

-> Recursive Union

-> Values Scan on "*VALUES*"

-> WorkTable Scan on t_recursive_union

Filter: (i < 10)

-> CTE Scan on t_recursive_union

上述例子由RecursiveUnion算子处理,初始数据是VALUSE (0),然后再递归部分处理输出,即“SELECT i + 1 FROM t_recursive_union WHERE i < 10”。

RecursiveUnion使用左子树获取初始元组(初始迭代种子),使用右子树递归输出其余元组。RecursiveUnion算子提供的主要函数如表7-10所示。

表7-10 RecursiveUnion算子主要函数

主要函数

说明

ExecInitRecursiveUnion

初始化RecursiveUnion状态节点

ExecRecursiveUnion

迭代输出元组

ExecEndRecursiveUnion

清理RecursiveUnion节点

ExecReScanRecursiveUnion

重置RecursiveUnion节点

ExecReScanRecursivePlanTree

重置RecursiveUnion计划树

RecursiveUnion算子对应的关键结构体代码如下:

typedef struct RecursiveUnion

{

Planplan;

intwtParam;/* 对应的工作表ID */

intnumCols;/* 去重属性个数 */

AttrNumber *dupColIdx;/* 去重判断属性编号 */

Oid *dupOperators;/* 去重判断函数 */

Oid *dupCollations;

longnumGroups;/* 元组树估算 */

} RecursiveUnion;

ExecInitRecursiveUnion函数的主要执行流程如下。

(1) 构造递归合并状态节点,并初始化工作表(working_table)和缓存表(intermediate_table),如果需要去除重复则需要构造哈希表上下文。
(2) 初始化左子节点(用于输出初始元组作为迭代种子)和右子节点(用于迭代输出其他满足迭代条件的元组)。
(3) 创建用于去重的哈希表。

ExecRecursiveUnion函数是RecursiveUnion节点的主体函数,它的主要执行流程是:

(1) 执行左子节点,将获取元组直接返回(左子节点用于输出初始迭代种子);如需要去重则把元组加入哈希表中。
(2) 当处理完左节点(所有的初始种子已经输出),则执行右子节点获取其余元组,在执行右子节点时会逐一从工作表(working_table)获取迭代输入,并把非空的元组放入缓存表(intermediate_table)。
(3) 当工作表为空时,则把缓存表作为新的工作表,直至所有的元组都输出(缓存表和工作表都为空),如需要去重则把元组加入哈希表中。

ExecEndRecursiveUnion是清理函数,负责释放执行过程申请的存储资源(用于去重的哈希表),并关闭左子节点和右子节点。

posted @ 2024-04-30 10:35  openGauss-bot  阅读(2)  评论(0)    收藏  举报