openGauss向量化Merge Join--inner join

简介: openGauss向量化Merge Join--inner join

openGauss VecMergeJoin状态机


VecMergeJoin状态机如下图所示:下面我们以一个例子为例,解释各个join的执行情况。t30和t31的结构及数据如下:


postgres=# select * from t30
id1 | id2
----|----
1  | 1
2  | 3
2  | 3
(3 rows)

    postgres=# select * from t31
    id1 | id2
    ----|----
    1  | 1
    5  | 5
    2  | 3
    (3 rows)


    t30作为外表,t31作为内表,join条件为t30.id1=t31.id1。


    inner join


    1)EXEC_MJ_INITIALIZE_OUTER    取外表值1。进入EXEC_MJ_INITIALIZE_INNER状态2)EXEC_MJ_INITIALIZE_INNER    取内表值1。进入EXEC_MJ_SKIP_TEST状态3)EXEC_MJ_SKIP_TEST    1 = 1,进入EXEC_MJ_JOINTUPLES状态,并标记内表值14)EXEC_MJ_JOINTUPLES    BatchFillInnerAndOuter将内外表值分别放到m_pInnerMatch和m_pOuterMatch中,进入EXEC_MJ_NEXTINNER状态5)EXEC_MJ_NEXTINNER    取内表的下一个值2,和外表值1比较。1 < 2,进入EXEC_MJ_NEXTOUTER状态6)EXEC_MJ_NEXTOUTER    外表值取下一个值2,进入EXEC_MJ_TESTOUTER状态7)EXEC_MJ_TESTOUTER    外表值2,和标记的内表值1比较。2 > 1,接着取内表当前值2,进入EXEC_MJ_SKIP_TEST状态。8)EXEC_MJ_SKIP_TEST    2 = 2,进入EXEC_MJ_JOINTUPLES状态,标记内表位置为29)EXEC_MJ_JOINTUPLES    BatchFillInnerAndOuter将内外表值分别放到m_pInnerMatch和m_pOuterMatch中,进入EXEC_MJ_NEXTINNER状态。10)EXEC_MJ_NEXTINNER    取内表的下一个值5,和外表值2比较。2 < 5,进入EXEC_MJ_NEXTOUTER状态11)EXEC_MJ_NEXTOUTER    取外表的下一个值2,进入EXEC_MJ_TESTOUTER状态12)EXEC_MJ_TESTOUTER    外表值2,和标记的内表值2比较。2 = 2,进入EXEC_MJ_JOINTUPLES状态,调整内表当前扫描位置为标记位置,即2。13)EXEC_MJ_JOINTUPLES    BatchFillInnerAndOuter将内外表值分别放到m_pInnerMatch和m_pOuterMatch中,进入EXEC_MJ_NEXTINNER状态。14)EXEC_MJ_NEXTINNER    取内表的下一个值5,和外表值2比较。2 < 5,进入EXEC_MJ_NEXTOUTER状态15)EXEC_MJ_NEXTOUTER    外表值已取完,结束。此时,m_pInnerMatch和m_pOuterMatch的值分别为:

      m_pInnerMatch m_pOuterMatch
          1             1
          2             2
          2             2

      最终调用函数ProduceResultBatchT,将两个batch投影到一个batch中,输出最终join结果。

      目录
      相关文章
      |
      2月前
      |
      算法 关系型数据库 MySQL
      浅析MySQL Join Reorder算法
      本文浅析了MySQL Join Reorder算法的流程,cost计算,剪枝算法等,希望通过本文能帮助大家了解MySQL优化器生成执行计划的具体流程。
      |
      3月前
      |
      存储 关系型数据库 MySQL
      mysql中的left join、right join 、inner join的详细用法
      【8月更文挑战第16天】在MySQL中,`INNER JOIN`、`LEFT JOIN`与`RIGHT JOIN`用于连接多表。`INNER JOIN`仅返回两表中匹配的行;`LEFT JOIN`保证左表所有行出现于结果中,右表无匹配时以NULL填充;`RIGHT JOIN`则相反,保证右表所有行出现于结果中。例如,查询学生及其成绩时,`INNER JOIN`仅显示有成绩的学生;`LEFT JOIN`显示所有学生及他们对应的成绩,无成绩者成绩列为空;`RIGHT JOIN`显示所有成绩及对应学生信息,无学生信息的成绩条目则为空。
      openGauss向量化Merge Join--semi join
      openGauss向量化Merge Join--semi join
      94 0
      |
      6月前
      |
      SQL Oracle 关系型数据库
      Oracle查询优化-left join、right join、inner join、full join和逗号的区别
      【1月更文挑战第5天】【1月更文挑战第13篇】实际查询时,多表联查是常规操作,但是连接方式有多种。
      539 0
      |
      OLAP Serverless
      openGauss向量化引擎--hash join
      openGauss向量化引擎--hash join
      134 0
      Hive中的in、exists和left semi join
      Hive中的in、exists和left semi join
      Hive中的in、exists和left semi join
      |
      SQL 关系型数据库 MySQL
      MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
      MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
      460 0
      MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
      |
      SQL 分布式计算 并行计算
      PostgreSQL 并行计算解说 之18 - parallel merge join
      标签 PostgreSQL , cpu 并行 , smp 并行 , 并行计算 , gpu 并行 , 并行过程支持 背景 PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持27余种场景的并行计算。 parallel seq scan
      902 0
      |
      关系型数据库 PostgreSQL