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结果。

      目录
      相关文章
      |
      25天前
      |
      机器学习/深度学习 分布式计算 MaxCompute
      ODPS问题之什么是Join/Inner Join
      ODPS问题之什么是Join/Inner Join
      openGauss向量化Merge Join--semi join
      openGauss向量化Merge Join--semi join
      78 0
      |
      OLAP Serverless
      openGauss向量化引擎--hash join
      openGauss向量化引擎--hash join
      109 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
      407 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 sharding extensino citus 优化器 Query Processing 之 - Subquery/CTE Push-Pull Execution
      标签 PostgreSQL , citus , sharding , push , pull , 优化器 背景 citus 是postgresql的sharding 开源中间件,2018年被微软收购,插件依旧开源。 在处理非常复杂的SQL时,CITUS使用推拉模型,支持跨节点的数据交换,用以处理复杂SQL。 中间结果的push,pull过程: push : shard ->
      264 0
      |
      JavaScript 关系型数据库 MySQL
      MySQL 子查询优化[IN/EXISTS]--smei join
      MySQL 里面有哪些子查询呢? 标量子查询 内联视图 半连接/反连接 本篇主要讲解半连接查询 半连接?可以这么理解 where 条件后面有In/EXISTS这样的子查询称为semi jion 格式:select .
      5358 0