openGauss源码解析(147)

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

7.6.3 物化算子

1. VecMaterial算子

VecMaterial算子能够缓存需要多次重复扫描的子节点结果,有助于减少执行中的扫描代价。

VecMaterial算子对应的代码源文件是“vecmaterial.cpp”。VecMaterial算子对应的主要数据结构是VecMaterialState,继承于MaterialState。相关代码如下:

typedef struct VecMaterialState : public MaterialState {

VectorBatch* m_pCurrentBatch;

BatchStore* batchstorestate;

bool from_memory;

} VecMaterialState;

VecMaterial算子的相关函数包括:ExecInitVecMaterial(初始化节点)、ExecVecMaterial(执行节点)、ExecEndVecMaterial(退出节点)、ExecReScanVecMaterial(重置节点)。

ExecInitVecMaterial函数用于初始化VecMaterial算子。主要执行流程如下。

(1) 创建并初始化VecMaterialState执行节点。
(2) 分别调用“ExecInitResultTupleSlot(estate, &matstate->ss.ps)”函数和“ExecInitScanTupleSlot(estate, &matstate->ss)”函数分配用于存储投影结果和用于扫描的slot。
(3) 调用“ExecAssignScanTypeFromOuterPlan(&matstate->ss)”函数初始化元组类型,调用“ExecAssignResultTypeFromTL(&matstate->ss.ps,matstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor->tdTableAmType)”函数初始化结果扫描描述符。
(4) 最后如果当前VecMaterial节点处于子计划中并且物化Stream数据,需要将其添加到estate->es_material_of_subplan中。

ExecVecMaterial函数是VecMaterial算子的主体函数,根据materalAll判断是否需要一次性物化所有元组,通过分别调用exec_vec_material_all函数、exec_vec_material_one函数完成算子的执行。其中exec_vec_material_all函数会一次性物化全部元组,之后根据需要返回部分元组,而exec_vec_material_one函数则会逐个物化元组。

ExecEndVecMaterial函数用于清理VecMaterial算子执行过程中使用的资源主要执行流程是:首先调用“ExecClearTuple(node->ss.ss_ScanTupleSlot)”函数清理tuple table,之后调用batchstore_end释放用于存储元组的资源,最后调用“ExecEndNode(outerPlanState(node)) ”函数清理子计划节点。

ExecReScanVecMaterial函数用于重新执行扫描计划,流程如图7-32所示。主要执行流程是:

(1) 根据eflags判断tuplestore是否进行其他操作(如REWIND、BACKWARD、RESTORE)。
(2) 若未进行其他操作,则直接调用“VecExecReScan(node->ss.ps.lefttree)”函数进行重新扫描,反之则需要进一步判断是否已执行了物化操作。
(3) 若未进行物化操作,则同样直接调用“VecExecReScan(node->ss.ps.lefttree)”函数进行重新扫描;若已产生物化结果,则需要根据进行操作的不同进行不同处理。
(4) 已产生物化结果可以分为2种情况:REWIND操作和其他操作。如果进行了REWIND操作,则需要调用batchstore_end函数释放已经存储的结果,之后调用“VecExecReScan(node->ss.ps.lefttree)”函数重新扫描。对于其他操作,需要判断当前计划是否为partition-wise join并且是否需要切换分区。
(5) 如是则同样需要调用batchstore_end和VecExecReScan函数重新扫描计划;反之只需要调用“batchstore_rescan(node->batchstorestate)”函数。

图7-32 ExecReScanVecMaterial函数执行流程

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