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中的三种实现方式 的相关文章

  • 使用子查询与 LEFT JOIN 一起选择 MAX 值

    我有一个获取搜索结果的查询 效果很好 查询成功示例 SELECT individuals individual id individuals unique id TIMESTAMPDIFF YEAR individuals day of b
  • Fluent NHibernate - 将属性映射到连接表上的列

    我有几张桌子 例如 产品 Id 名称 制造商 ID 制造商 ID 名称 我希望能够在我的产品对象上包含ManufacturerName 而不是当我只需要名称时必须加载整个制造商行 我的产品地图看起来像 Table Product Id x
  • 附加两个具有相同列、不同顺序的数据框

    我有两个熊猫数据框 noclickDF DataFrame 0 123 321 0 1543 432 columns click id location clickDF DataFrame 1 123 421 1 1543 436 colu
  • 时间序列数据的自连接

    我需要一些帮助来完成我认为应该是相当简单的自连接查询 只需要将两条记录中匹配的开始时间和结束时间合并为一条记录 假设我的表中有以下内容 Time Event 08 00 Start 09 00 Stop 10 30 Start 10 45
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 如何在基于其他数据帧的数据帧中创建联接?

    我有 2 个数据框 一份包含学生批次详细信息 另一份包含分数 我想加入 2 个数据框 数据框1包含 s1 s2 s3 Stud1 Stud2 Stud3 Stud2 Stud4 Stud1 Stud1 Stud3 Stud4 数据框2包含
  • data.table 对数字和文本变量分别进行分组

    我正在尝试简化这个data table作用于数字变量和字符变量的两阶段过程 例如 取第一个元素textvar and sum每个数值变量 考虑这个小例子 library data table dt lt data table grpvar
  • LEFT JOIN 返回与 INNER JOIN 相同的结果

    我有一张桌子 磨砂膏 里面有 1600 个独特的物品 第二张桌子有100万以上 我运行 INNER JOIN 并获得 65 个匹配项 SELECT a BW Parent Number a Vendor Name b Parent Supp
  • Django:使用 Django ORM 实现 JOIN?

    我有一个用 Django 构建的问答类型的网站 具有以下模型 class Question models Model title models CharField max length 70 details models TextField
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 非等值连接 - 比较 R 中的两个数据帧

    我想根据第二个数据框中存在的值过滤数据框 例如 匹配第一个数据帧中 BP 列中高于 start pos 列的第一个值且小于 end pos 列或仅小于第二个数据中的 end pos 的行框架 我需要对第二个数据框中的所有值重复此过程 目前
  • JPA:如何从多个表的列组合实体(不将实体保存到多个表)

    我有两个实体 Entity Table name TableA public class TableA Id Column name id long id Column name tableB id long tbId Column nam
  • SQL Server 2012 中带有“AND”运算符的“LIKE”子句

    我的要求与该线程完全相同 如何在 SQL Server 中使用 JOIN LIKE 和 AND 运算符 https stackoverflow com questions 39745766 how to use join like with
  • 是否可以将普通表与临时表进行左外连接?

    我创建 SQL Server 查询并有一个包含记录的普通表 另一方面有一个包含记录的临时表 该表不为空 并且所有字段都没有任何冲突 加入 可以连接这两个不同类型的表吗 SELECT NormalTable Entityname FROM N
  • PostgreSQL 连接使用generate_series 对表进行非规范化

    我有这张表 CREATE TABLE mytable name text count integer INSERT INTO mytable VALUES john 4 mark 2 albert 3 我想以这种方式 去规范化 行 SELE
  • solr JOIN 查询

    我需要在 solr 索引上运行 JOIN 查询 我有两个已索引的 xml person xml 和 subject xml Person
  • SQLite:具有四个表的完全外连接

    编辑 可以找到这个问题的扩展here https stackoverflow com questions 47667304 sqlite full outer join with four tables with 30 columns 我想
  • MySQL - 基于日期加入

    是否可以根据同一日期连接两个表 而不考虑时间 就像是 从预约左侧加入销售 约会 日期 销售 日期 唯一的问题是它是一个日期时间字段 所以我想确保它只查看日期并忽略时间 你可以这样做 FROM appointments LEFT JOIN s
  • MySQL:“SELECT 将检查超过 MAX_JOIN_SIZE 行”

    我正在使用 PHP 和 MySQL 在我的程序中 有一个涉及连接的选择查询 当我在本地主机上运行它时 它工作正常 但是当我将它上传到我的服务器上并尝试执行它时 它会生成以下错误 The SELECT would examine more t
  • 如何连接行并添加分隔符?

    命令J连接线 命令gJ连接线删除空格 是否还有连接行的命令 在行之间添加分隔符 Example Input text other text more text text 我想做的事 选择这4行 如果开始和 或 EOL 处有空格 请将其删除

随机推荐

  • 【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