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子计划节点。

浙公网安备 33010602011771号