openGauss源码解析(153)

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

3. VecHashJoin算子

VecHashJoin算子对应的主要数据结构是VecHashJoinState,VecHashJoinState继承于HashJoinState。具体定义如下:

typedef struct VecHashJoinState : public HashJoinState {

int joinState;

void* hashTbl;

FmgrInfo* eqfunctions;

vecqual_func jitted_joinqual;

vecqual_func jitted_hashclause;

char* jitted_innerjoin;

char* jitted_matchkey;

char* jitted_buildHashTable;

char* jitted_probeHashTable;

int enable_fast_keyMatch;

BloomFilterRuntime bf_runtime;

char* jitted_hashjoin_bfaddLong;

char* jitted_hashjoin_bfincLong;

char* jitted_buildHashTable_NeedCopy;

} VecHashJoinState;

VecHashJoin算子的相关函数包括:ExecInitVecHashJoin(初始化节点)、ExecVecHashJoin(执行节点)、ExecEndVecHashJoin(退出节点)、ExecReScanVecHashJoin(重置节点)。

ExecInitVecHashJoin函数用于初始化Vechash join执行算子,并把VecHashJoin计划节点转换成计划执行节点。主要执行流程是:首先处理左子树,得到外执行计划节点;再处理右子树,得到内执行计划节点;最后初始化元组和投影信息。

ExecVecHashJoin函数是执行VecHashJoin的主体函数,执行VecHashJoin状态机。

ExecEndVecHashJoin函数用于在执行结束时清理VecHashJoin算子。主要执行流程是:首先释放内存上下文,之后释放表达式,清空左右子树。流程如图7-34所示。

图7-34 ExecEndVecHashJoin函数执行流程

ExecReScanVecHashJoin函数用于重新执行扫描计划。主要执行流程是:首先判断状态信息,如哈希表为空时,只需要重新扫描左子树计划,否则需要重新构建哈希表。

7.7 小结

本章节主要介绍了执行器的总体框架、执行器算子、向量化引擎;向量化引擎通过编译执行模块实现执行加速。执行器接收Plan(优化器输出),对Plan做转换处理,生成状态树,状态树的节点对应执行算子(这些算子利用存储和索引提供的接口,实现数据读写);执行器是SQL语句同存储交互的中介。这些执行算子有统一的接口以及相似的执行流程(初始化、迭代执行、清理3个过程)。向量化引擎面向OLAP场景需求,同编译执行相结合提供高效执行效率。

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