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中的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
      78 0
      |
      OLAP Serverless
      openGauss向量化引擎--hash join
      openGauss向量化引擎--hash join
      109 0
      |
      SQL 数据库
      SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
      SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
      124 0
      SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
      |
      SQL 关系型数据库 MySQL
      MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
      MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
      406 0
      MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
      |
      SQL 语音技术 数据库
      SQL基础【十五、join、Inner join、Left join、Right join、Full join】
      SQL基础【十五、join、Inner join、Left join、Right join、Full join】
      141 0
      SQL基础【十五、join、Inner join、Left join、Right join、Full join】
      |
      分布式计算 MaxCompute 索引
      【转载】MaxCompute full outer join改写left anti join实践
      ods层数据同步时经常会遇到增全量合并的模型,即T-1天增量表 + T-2全量表 = T-1全量表。可以通过full outer join脚本来完成合并,但是数据量很大时非常消耗资源。本文将为您介绍在做增量数据的增加、更新时如何通过full outer join改写left anti join来实现的最佳实践。
      12807 0
      【转载】MaxCompute full outer join改写left anti join实践
      |
      SQL 分布式计算 并行计算
      PostgreSQL 并行计算解说 之18 - parallel merge join
      标签 PostgreSQL , cpu 并行 , smp 并行 , 并行计算 , gpu 并行 , 并行过程支持 背景 PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持27余种场景的并行计算。 parallel seq scan
      870 0
      |
      SQL 人工智能 分布式计算
      PostgreSQL 并行计算解说 之20 - parallel partition table wise join
      标签 PostgreSQL , cpu 并行 , smp 并行 , 并行计算 , gpu 并行 , 并行过程支持 背景 PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持27余种场景的并行计算。 parallel seq scan
      427 0