openGauss源码解析(152)
openGauss源码解析:执行器解析(46)
7.6.4 连接算子
1. VecNestLoop算子
VecNestLoop算子对应的主要数据结构是VecNestLoopState,VecNestLoopState继承于NestLoopState。具体定义代码如下:
struct VecNestLoopState : public NestLoopState {
void* vecNestLoopRuntime;
vecqual_func jitted_vecqual;
vecqual_func jitted_joinqual;
};
VecNestLoop算子的相关函数包括:ExecInitVecNestLoop(初始化节点)、ExecVecNestLoop(执行节点)、ExecEndVecNestLoop(退出节点)、ExecReScanVecNestLoop(重置节点)。
ExecInitVecNestLoop函数用于初始化VecNestLoop执行算子。主要执行流程如下。
(1) 初始化VecNestLoop执行算子。
(2) 为节点创建表达式上下文,分别处理左右子树,得到外执行计划节点和内执行计划节点。
(3) 初始化元组和投影信息。
ExecVecNestLoop函数是执行VecNestLoop的主体函数,通过执行VecNestLoop状态机,并获得结果元组。
ExecEndVecNestLoop函数用于在执行结束时清理VecNestLoop算子。主要执行流程是:首先释放表达式上下文,之后清空元组,最后清空子计划节点。
ExecReScanVecNestLoop函数用于重新执行扫描计划。主要执行流程是:首先把VecNestLoop计划节点转换成外计划执行节点,之后判断外计划执行节点的chgParam是否为空,若chgParam为空,则重新扫描节点。
2. VecMergeJoin算子
VecMergeJoin算子对应的主要数据结构是VecMergeJoinState,VecMergeJoinState继承于MergeJoinState。具体定义代码如下:
struct VecMergeJoinState : public MergeJoinShared {
/* 向量化执行支持 */
VecMergeJoinClause mj_Clauses;
MJBatchOffset mj_OuterOffset;
MJBatchOffset mj_InnerOffset;
ExprContext* mj_OuterEContext;
ExprContext* mj_InnerEContext;
MJBatchOffset mj_MarkedOffset;
VectorBatch* mj_MarkedBatch;
BatchAccessor m_inputs[2];
MJBatchOffset m_prevInnerOffset;
bool m_prevInnerQualified;
MJBatchOffset m_prevOuterOffset;
bool m_prevOuterQualified;
bool m_fDone;
VectorBatch* m_pInnerMatch;
MJBatchOffset* m_pInnerOffset;
VectorBatch* m_pOuterMatch;
MJBatchOffset* m_pOuterOffset;
VectorBatch* m_pCurrentBatch;
VectorBatch* m_pReturnBatch;
vecqual_func jitted_joinqual;
};
VecMergeJoin算子的相关函数包括:ExecInitVecMergeJoin(初始化节点)、ExecVecMergeJoinT(执行节点)、ExecEndVecMergeJoin(退出节点)、ExecReScanVecMergeJoin(重置节点)。
ExecInitVecMergeJoin函数用于初始化VecMergeJoin执行算子。主要执行流程如下。
(1) 初始化VecMergeJoin执行算子。
(2) 为节点创建表达式上下文,分别处理左右子树,得到外执行计划节点和内执行计划节点。
(3) 初始化元组和投影信息。
ExecVecMergeJoinT函数是执行VecMergeJoin的主体函数,执行VecMergeJoin状态机,并根据join类型,获取结果元组。
ExecEndVecMergeJoin函数用于在执行结束时清理VecMergeJoin算子。首先释放表达式上下文,之后清空元组,最后清空左右子树节点。
ExecReScanVecMergeJoin函数用于重新执行扫描计划。主要执行流程是:首先重置节点相关参数,之后判断左右子树的chgParam是否为空;若chgParam为空时,则重新扫描节点。

浙公网安备 33010602011771号