Semi-join在Greenplum中的三种实现方式

2023-05-16

Semi-join(半连接)是用来处理外表的记录是否在内表中存在与其匹配的行,而无需考虑匹配行的条数,半连接的返回结果集仅使用外表数据集,使用场景如:in、exists、>|<|= any等操作。本文将为大家详细介绍Semi-join在Greenplum中的三种实现方式。

Se mi-join 是 Greenplum 的一种内部算子,用户无法直接在 sql 语句中使用, semi-join 算子可以用在 nestloop 、 hashjoin 以及 mergejoin 中。与普通 join 算子不同,外表一行数据只要在内表中找到与其匹配的行即可返回,无需将内表数据全部过滤一遍。

Semi-join在GPDB中有三种实现方式:semi-join算子、inner join (外表,unique(内表))、unique(inner join(外表,内表)),通过执行计划依次对每种方式进行介绍。

Semi-Join算子

Semi-join有nestloop semi-join、hash semi-join以及merge semi-join三种形式。外表每行数据在内表中进行探测,只要在内表中找到满足条件的记录,外表数据返回,继续处理外表中下一条数据,无需扫描内表中其余数据,以nestloop semi-join为例,如果第一行数据就符合条件,那么内表其他数据都不需要再扫描,普通nestloop算子每条外表数据都需要对内表做一次全表扫描。Semi-join内外表位置固定,受语义影响,不能交换位置。

建表并插入数据:

create table t1(tc1 int);create table t2(tc1 int);insert into t1 select generate_series(1,6);insert into t2 select generate_series(3,10);

通过调整enable_hashjoin、enable_nestloop、enable_mergejoin三个参数的值构造semi join的三种情况。

Semi-join算子的优点:实现简单,不需要增加额外算子。

Semi-join算子的缺点:Semi-join中内外表位置受语义限制,无法交换,但是join中有些场景小表做内表性能更佳,如hashjoin(小表做内表可以尽量避免使用外存)和nestloop(小表做内表可以将内表数据物化,不需要每次重复扫描)。

Inner Join(外表,unique(内表))

如果内表连接键数据没有重复,那么semi-join可以转换为inner join,因此可以将内表数据先去重,去重后的内表与外表进行inner join连接,实现semi-join的功能,inner join内外表可以交换,从而选择较优计划。

create table t3(tc1 int,tc2 int);create table t4(tc1 int, tc2 int);insert into t3 values( generate_series(1,100) ,generate_series(1,1000));insert into t4 values( generate_series(1,100) ,generate_series(1,100));执行10次”insert into t4 select * from t4;”向t4中插入重复数据。analyze t3;analyze t4;

去重后t4表数据量较小,被选择为内表:

Delete from t3;Delete from t4;insert into t3 values( generate_series(1,10) ,generate_series(1,10));insert into t4 values( generate_series(1,100) ,generate_series(1,100));执行10次”insert into t4 select * from t4;”向t4中插入重复数据。analyze t3;analyze t4;

去重后的t4表数据量较大,做外表,小表t3做内表。

Unique(inner join(外表,内表))

以上两种方式在postgres单库中已经够用,而在MPP数据库中除了考虑连接顺序还需要考虑数据在节点间的分布,上述两种方式只能支持内、外表都按照连接键进行hash分布,或者外表是分布式表,内表复制的场景。无法支持外表复制而内表分布式的场景。

如果两个表t5和t6都是随机分布,外表t5数据量很小,而内表t6数据量很大。为实现semi-join,一种方式是两边均按照连接键重hash,一种是将t6广播,这两种卖二手游戏数据转发的代价都相当大,若是inner join,可以采用广播t5的方式,但semi-join若是广播外表按照上述两种实现方式会得到错误结果,外表数据有重复。

因此MPP新增一种semi-join的实现方式,将外表数据进行广播,并对每条外表数据增加rowidexpr列,进行唯一标识,rowidexpr为int64的数据类型,为防止不同节点内产生相同的唯一标识,以节点编号segmentid作为该值的高16位,广播数据后,先做inner join然后对join后的结果按照rowidexpr列去重。

create table t5(tc1 int) distributed randomly;create table t6(tc1 int) distributed randomly;insert into t5 select generate_series(1,10);insert into t6 select generate_series(1,1000000);analyze t5;analyze t6;

以上就是semi-join在Greenplum中的三种实现方式,不同的方式适用于不同场景,需要根据代价pk选择出较优计划。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Semi-join在Greenplum中的三种实现方式 的相关文章

随机推荐

  • 【BIM+GIS】BIM模型导入GIS软件之前的一些处理设置

    文章目录 一 模型位置发生偏移 二 模型对象丢失或增加 三 模型材质发生变化 四 导出过程缓慢 五 模型属性批量丢失 一 模型位置发生偏移 在视图 可见性 图形替换模型类别 场地 VV可见性快捷 勾选项目基点 单击选中项目基点 在属性中修改
  • vscode中用快捷键 Alt + Shift + F 格式化代码不生效的问题

    vscode中用快捷键 Alt 43 Shift 43 F 格式化代码不生效 xff08 文件中 script脚本部分的代码没有格式化 xff09 的问题 在 vscode 中书写代码 xff0c 有时候缩进格式不一致 xff0c 代码没有
  • 查询 Linux 命令属于哪个软件包

    在 Linux 中 xff0c 有些命令的名称软件包的名称是不一样的 xff0c 或者一个软件包中包含有多个命令 有时候 xff0c 我们需要确定某个命令来自于哪个软件包 xff0c 以便于可以在其他机器上安装 xff0c 或者寻找该软件包
  • 一文读懂 NMEA-0183 协议数据

    NMEA 是 National Marine Electronics Association 的缩写 xff0c 是美国国家海洋电子协会的简称 xff0c 现在是 GPS 导航设备统一的 RTCM 标准协议 NMEA 0183 协议是目前
  • 使用 GPSD 快速读取 GPS 信息

    在 Linux 系统中 xff0c 如果你需要连接 GPS 传感器进行测试 xff0c 那么使用 GPSD 可以满足你的需求 xff0c 帮助你快速实现 GPS 数据的获取 本文将使用导远 INS570D 传感器 xff08 车载高精度组合
  • 如何将 Markdown 格式文章快速发布到微信公众号

    如果你和我一样 xff0c 平时习惯使用 Markdown 写作 xff0c 当我们想把文章发布到微信公众号或知乎等平台时 xff0c 就会发现挺麻烦的 xff0c 尤其是排版方面 xff0c 因为它们并不支持 Markdown 格式 那有
  • 推荐几款好用的数据库管理工具

    本文主要介绍几款常用的数据库管理软件 xff08 客户端 xff09 xff0c 包括开源 免费的 商用收费的 xff0c 其中有一些是专用于 MySQL 数据库的 xff0c 例如 MySQL Workbench phpMyAdmin x
  • Ubuntu 22.04(Jammy)安装 ROS2(Humble)

    本文介绍如何在 Ubuntu 22 04 xff08 Jammy xff09 上安装 ROS 2 软件包 xff0c ROS 2 的版本是当前最新的 Humble Hawksbill 本教程适用于 amd64 和 arm64 平台 准备工作
  • 从落地效果看,转转选择TDengine的三个理由

    在转转的业务中 xff0c 我们使用了Nginx作为我们的反向代理 xff0c 为保证代理层可用性 xff0c 需要对Nginx进行实时状态监控 在服务器的基础监控的选择上 xff0c 我们将OpenFalcon逐步替换为夜莺 xff0c
  • 计算字符串 s 构成的最长回文串长度

    题目 给定一个包含大写字母和小写字母的字符串 s 返回通过这些字母构成的最长的回文串 在构造过程中 请注意区分大小写 比如 Aa 不能当做一个回文字符串 示例 1 输入 s abccccdd 输出 7 解释 我们可以构造的最长的回文串是 d
  • 常见激光雷达厂商 SDK 软件包汇总

    本文收集目前主要激光雷达厂商的 SDK 软件包 xff0c 其中大多还会提供 ROS xff08 ROS1 和 或 ROS2 xff09 驱动软件包 使用这些 SDK 软件包 xff0c 可以快速地将激光雷达集成到你的智能系统中 xff0c
  • GitHub 开启 2FA 双重身份验证的方法

    为什么要开启 2FA 自2023年3月13日起 xff0c 我们登录 GitHub 都会看到一个要求 Enable 2FA 的重要提示 xff0c 具体如下 xff1a GitHub users are now required to en
  • 在 Linux 系统中如何查看和指定 C 语言标准

    本文主要介绍在 Linux 系统中如何查看当前支持的 C 语言版本 xff0c 以及在编译时如何指定 C 语言标准 目前常见的 C 语言标准有 C89 C99 C11 和 C17 xff0c 详情可参考 C语言标准 查看 C 语言标准 我们
  • 使用Openssl EVP函数计算Hash值

    OpenSSL EVP函数库提供了一组用于加密操作高层接口 xff0c 其中也包含了计算消息摘要Hash值得函数 OpenSSL提供了MD2 MD4 MD5 sha1 sha256 sha512等多种Hash算法 计算Hash值相关API
  • 51单片机+L298N控制步进电机【T型】加减速

    本文介绍另一种常见的步进电机 T型 加减速方法 关于L298N模块的使用介绍 以及S型加减速可以上一篇文章 xff0c 传送门如下 xff1a 51单片机 43 L298N控制步进电机S曲线加减速 1 与S曲线加减速对比 1 S曲线一般用查
  • curl用法2

    CURLOPT FTPSSLAUTH The FTP authentication method when is activated CURLFTPAUTH SSL try SSL first CURLFTPAUTH TLS try TLS
  • 简单小实验——串口控制LED灯(HAL库)

    硬件设备 STM32F103ZET3开发板 STLink 功能实现 发送ON LED亮 发送OFF LED灭 其他指令串口发送error 实验过程 波特率设置为115200 数据位8 奇偶校验位None 停止位1 这里我采用的是中断的方式去
  • sudo apt-get update报错【错误:5 http://packages.ros.org/ros/ubuntu xenial InRelease】

    sudo apt get update报错 错误 5 http packages ros org ros ubuntu xenial InRelease 解决办法 xff1a ros的wiki官网 xff0c 更新公钥 网址http wik
  • windowns10下安装MySQL

    安装时参考一下这个链接 xff0c 亲测可用 https blog csdn net qq 45173404 article details 107369405 fps 61 1 amp locationNum 61 2
  • Semi-join在Greenplum中的三种实现方式

    Semi join xff08 半连接 xff09 是用来处理外表的记录是否在内表中存在与其匹配的行 xff0c 而无需考虑匹配行的条数 xff0c 半连接的返回结果集仅使用外表数据集 xff0c 使用场景如 xff1a in exists