openGauss源码解析(127)
openGauss源码解析:执行器解析(20)
2. merge join算子
merge join算子用于支持排序结果集连接,对应的代码源文件是“nodeMergeJoin.cpp”。通常情况下hash连接的效果都比排序合并连接要好,但如果元组已经被排序,在执行排序合并连接时不需要再排序,这时排序合并连接的性能会优于hash连接。merge join算子连接处理的逻辑同经典的归并排序算法相似,需要首先找到匹配位置,然后迭代获取外表与内表匹配位置。
merge join算子相关的核心函数包括:ExecInitMergeJoin、ExecMergeJoin。下面分别介绍这两个主要函数。
ExecInitMergeJoin函数用于初始化merge join状态节点。主要执行流程如下。
(1) 创建merge join状态节点。
(2) 初始化表达式(目标表达式、join连接表达式、条件过滤表达式等)。
(3) 初始化内外节点。
(4) 根据join类型初始化状态节点信息。
ExecMergeJoin函数用于处理归并连接。主要执行流程是:通过2层switch判断当前归并连接的状态(类似与归并排序),计算连接值如发现匹配元组则直接返回,否则继续从外表或内表中获取有序元组,按照连接状态做匹配判断。
3. nested loop join算子
nested loop join算子一般用在连接的表中有索引,并且索引选择性较好的时候,对应的代码源文件是“nodeNestedloop.cpp”。对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。Nestedloop算子执行的主要过程是:通过外表(左子节点)驱动内表(内子节点),外表处于外循环,外表返回的每一行都要在内表中检索找到与它匹配的行。因此整个查询返回的结果集不能太大,要把返回子集较小表的作为外表,而且在内表的连接字段上一定要有索引。