openGauss源码解析(114)

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

2. Append算子

Append算子对应的代码源文件是“nodeAppend.cpp”,用于处理包含一个或多个子计划的链表。Append遍历子计划链表逐个执行子计划,当子计划返回全部结果后,迭代执行下一个子计划。Append算子通常用于SQL中的集合操作中,例如多个Union All操作,可以对多个子查询的结果取并集;另外Append算子还可以用来实现继承表的查询功能。

Append算子提供的主要函数如表7-7所示。

表7-7 Append算子主要函数

主要函数

说明

ExecInitAppend

初始化Append节点

ExecAppend

迭代获取元组

ExecEndAppend

关闭Append节点

ExecReScanAppend

重新扫描Append节点

exec_append_initialize_next

为下一个扫描节点设置状态

ExecInitAppend函数初始化Append状态节点,主要执行流程如下。

(1) 初始化Append执行状态节点(AppendState)。
(2) 迭代初始化子计划链表(初始化每一个子计划)。
(3) 设置初始迭代子计划。

ExecAppend函数迭代输出元组,是Append算子主体函数。每次从子计划中获取一条元组,直到返回元组为空,则移到下一个子计划(使用as_whichplan标记),直至所有子计划都全部执行完。执行流程如图7-7所示。

图7-7 Append算子执行流程

ExecEndAppend函数负责Append节点清理,遍历子计划数组,逐一释放子计划对应的资源。

3. BitmapAnd算子

BitmapAnd算子对应的代码源文件是“nodeBitmapAnd.cpp”,用于对多个属性约束都有索引,且属性约束是And运算,对结果做And位图运算。例如:(colA约束条件)AND (colB约束条件),且colA,colB建有索引,colA对应的位图是Bitmap A,colB对应的位图是Bitmap B。位图运算如图7-8所示。

图7-8 Bitmap And操作

BitmapAnd算子提供的主要函数如表7-8所示。

表7-8 BitmapAnd算子主要函数

主要函数

说明

ExecInitBitmapAnd

BitmapAnd节点初始化

MultiExecBitmapAnd

获取Bitmap节点

ExecEndBitmapAnd

关闭BitmapAnd节点

ExecReScanBitmapAnd

重新扫描BitmapAnd节点

ExecInitBitmapAnd函数主要执行流程:首先创建Bitmapand状态节点;然后再逐一初始化子计划状态节点。

MultiExecBitmapAnd函数是BitmaAnd计划节点的主体函数,通过迭代方式做求交运算,结果集是一个新的节点。

ExecEndBitmapAnd函数是计划节点退出函数,负责关闭BitmapAnd子计划节点。

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