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

      目录
      相关文章
      |
      6月前
      |
      JavaScript 前端开发 Java
      Spring Boot 与 Vue.js 前后端分离中的数据交互机制
      本文深入探讨了Spring Boot与Vue.js在前后端分离架构下的数据交互机制。通过对比传统`model.addAttribute()`方法与RESTful API的设计,分析了两者在耦合性、灵活性及可扩展性方面的差异。Spring Boot以RESTful API提供数据服务,Vue.js借助Axios消费API并动态渲染页面,实现了职责分明的解耦架构。该模式显著提升了系统的灵活性和维护性,适用于复杂应用场景如论坛、商城系统等,为现代Web开发提供了重要参考。
      524 0
      |
      人工智能 关系型数据库 MySQL
      基于阿里云的PolarDB MySQL版实现AI增强数据管理
      本文将介绍如何利用阿里云的PolarDB MySQL版结合AI技术,实现数据管理的自动化和智能化。
      929 0
      |
      机器学习/深度学习 算法
      概率分布深度解析:PMF、PDF和CDF的技术指南
      本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。
      1054 15
      概率分布深度解析:PMF、PDF和CDF的技术指南
      |
      SQL 网络协议 网络安全
      【Python】已解决:pymssql._pymssql.OperationalError: (20009, b’DB-Lib error message 20009, severity 9:\nUn
      【Python】已解决:pymssql._pymssql.OperationalError: (20009, b’DB-Lib error message 20009, severity 9:\nUn
      528 0
      深入理解Java并发编程:线程池的使用与优化
      【2月更文挑战第15天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将首先介绍线程池的基本概念和作用,然后详细解析线程池的核心参数以及如何合理配置这些参数以优化性能。接下来,我们将通过实例演示线程池的使用方法,并探讨在高并发场景下如何进行线程池的调优。最后,我们将总结线程池的优势以及在使用过程中需要注意的问题。
      |
      存储 NoSQL Java
      分布式锁,Redission,其它实现问题讲解,以及面试题回答案例
      分布式锁,Redission,其它实现问题讲解,以及面试题回答案例
      573 1
      |
      存储 Java 开发工具
      轻松搭建分布式对象存储:Spring Boot整合MinIO的快速指南
      轻松搭建分布式对象存储:Spring Boot整合MinIO的快速指南
      1159 0
      轻松搭建分布式对象存储:Spring Boot整合MinIO的快速指南
      Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
      Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
      Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
      |
      图形学
      Unity——音频管理器(附例子)
      Unity——音频管理器(附例子)
      334 0
      |
      存储 缓存 Apache
      Apache Doris 巨大飞跃:存算分离新架构
      Apache Doris 巨大飞跃:全新的存算分离架构正式推出,SeiectDB 未来将贡献至 Apache Doris 社区
      1988 4
      Apache Doris 巨大飞跃:存算分离新架构