openGauss向量化Merge Join--semi join

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

openGauss向量化执行引擎的Merge Join


1 什么是semi join


Semi join语义:对于外表一行值,只要内表有一行与之相等,即满足join条件,就输出外表值。这里需要注意,仅输出外表值,而不和对应内表值合并输出。


2 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。


    3 semi join


    SEMI JOIN的状态转换和INNER JOIN相同,参考上篇:

    https://mp.weixin.qq.com/s?__biz=MzU1OTgxMjA4OA==&mid=2247484966&idx=1&sn=acca9c99807d339394ef00c3bd6cfeb1&chksm=fc10dab1cb6753a70f7e8f20563a52a6927f5e4b3fe1b8f572fbc38f5a3044b2a4b4f86a67f5&token=71514095&lang=zh_CN#rd

    这里不再赘述。不同之处在于JOIN结果Produce的过程。即ProduceResultBatchT函数完成的功能,这里针对ProduceResultBatchT函数说明semi join最后的处理过程。

    在执行ProduceResultBatchT函数前,m_pInnerMatch和m_pOuterMatch的值分别为:


    m_pInnerMatch m_pOuterMatch
        1             1
        2             2
        2             2

    需要对上面的值进行处理:

    1)更新m_pInnerMatch和m_pOuterMatch每列的行值为m_pInnerMatch的m_rows。因为对于NULL,他没有更新对应列行数

    2)pSelection[]数组都置为true,表示:上面两个batch选取哪行,哪行就为true。这里先置为true,方便下面计算

    3)针对每一行,都需要判断当前一行和下一行匹配的值是否在同一个位置,也就是源batch的第几行。如果在同一个位置,就表示后面的一个需要取消,即置为false。

    4)假设一个batch仅能容纳2行,下图的例子,红线上面:外表的4和内表2个4匹配,需要join,此时第2个匹配的根据SEMI JOIN语义需要去掉,即将对应的pSelect[]数组值置为false。

    5)红线上面的输出后,需要循环再次进入ExecVecMergeJoinT函数接着EXEC_MJ_NEXTINNER状态进行处理。此时已经跨了batch,则需要另外一个条件来判断是否重复。

    4)5)的条件为:

    第一个if针对跨batch的,第二个for循环的条件针对同一个batch的。这里详细解释下第一个条件:

    当跨batch时输出时,m_prevOuterOffset为外表当前扫描位置。再次循环进来比较时外表值是clause->ldatum,他的位置仍然保持是m_prevOuterOffset的位置,所以此时使用第一个条件即可更新pSelect[]数组。

    那么为什么同样使用第2个条件呢?因为如上图例子,第二次进来后处理第一个值是需要和上一个batch的最后一个记录比较,而不是本次的下一个比较(当然本次也没有下一个值)。

    以上即使SEMI JOIN向量化机制。比较晦涩,希望能够给大家抛砖引玉,带来方便。

    目录
    相关文章
    |
    边缘计算 人工智能 负载均衡
    什么是SD-WAN?
    【4月更文挑战第15天】
    8376 5
    |
    调度 弹性计算 存储
    拆解超算上云的障碍,阿里云用了这三招|E-HPC如何改变云超算?
    2019年阿里云上海峰会,由阿里云资深技术专家何万青带来以“阿里云超算E-HPC平台”为题的演讲。本文内容包括了HPC概念及发展趋势,面向“大计算”设计的弹性基础设施,客户应用云上优化,着重介绍了E-HPC自动伸缩,闲时计算方案与混合云,数据全流程可视化以及HPC工作流与数据迁移等。
    2259 0
    |
    缓存 负载均衡 算法
    有哪些方法可以提高硬件负载均衡设备的性能?
    有哪些方法可以提高硬件负载均衡设备的性能?
    454 58
    |
    网络协议
    通俗易懂理解三次握手、四次挥手(TCP)
    这篇文章用通俗的语言解释了TCP协议中的三次握手和四次挥手过程,通过比喻和详细的状态变化描述,帮助读者理解建立和断开连接的原理和原因。
    通俗易懂理解三次握手、四次挥手(TCP)
    |
    Kubernetes API Docker
    Mac docker-desktop 安装单机版k8s
    Mac docker-desktop 安装单机版k8s
    1365 0
    |
    Java API Maven
    SpringBoot+SeetaFace6搭建人脸识别平台
    【10月更文挑战第8天】以下是使用Spring Boot和SeetaFace6搭建人脸识别平台的步骤:首先安装Java和Maven,下载SeetaFace6库并添加依赖;接着创建Spring Boot项目并在`pom.xml`中添加必要依赖;然后配置SeetaFace6参数;实现人脸识别服务类与控制器类;最后使用工具如Postman测试API接口及识别结果。示例代码展示了如何接收图像数据并进行人脸检测。可根据具体需求扩展更多功能,如用户管理和历史记录等。
    1342 1
    |
    程序员
    stm32f407探索者开发板(二十一)——窗口看门狗
    stm32f407探索者开发板(二十一)——窗口看门狗
    838 0
    |
    数据安全/隐私保护
    分支和循环语句(2)
    分支和循环语句(2)
    142 1
    |
    弹性计算 虚拟化 异构计算
    阿里云GPU服务器NVIDIA A100 GPU卡租用价格表
    阿里云GPU服务器NVIDIA A100 GPU卡租用价格表,阿里云GPU服务器租用价格表包括包年包月价格、一个小时收费以及学生GPU服务器租用费用,阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折优惠,阿里云百科分享阿里云GPU服务器租用价格表、GPU一个小时多少钱以及学生GPU服务器收费价格表
    19067 0
    阿里云GPU服务器NVIDIA A100 GPU卡租用价格表