GPDB技术内幕 - SEMI JOIN浅析

2024-04-13 13:20
文章标签 技术 join 浅析 内幕 semi gpdb

本文主要是介绍GPDB技术内幕 - SEMI JOIN浅析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GPDB技术内幕 - SEMI JOIN浅析

SEMI JOIN顾名思义,半连接,相对于join字段来说,针对外表的一行记录,内表只要有一条满足,就输出外表记录。注意,这里是仅输出外表记录。GPDB中有几种实现方式,本文我们简单聊聊。

从代码中,我们看到SEMI JOIN的类型有3类:

0955d516f25d7d5fd38618319fabc939.png

1、JOIN_SEMI

这是普通实现方式。针对nestloop join、merge join、hash join的inner join来说,只要针对JOIN字段,内表有记录就输出外表记录。以nestloop join为例:

1a09da9e8607945ed5dd6e8e6315a7c1.png

外表和内表记录是无序的,针对外表第一个记录1,遍历内表。内表第一记录为11,不匹配,继续下一条记录;下一条是1,join匹配,输出外表1的值;此时针对外表记录1,就不必继续内表扫描了,join结束,继续外表下一个记录10重新扫描内表进行join条件判断。

这种方式是通用实现方式。下面看第二种实现方式。

2、JOIN_UNIQUE_OUTER/JOIN_UNIQUE_INNER

从SEMI JOIN的语义中,可以看出join过成中,外表一个值仅能匹配内表一个值;这样我们就可以先将内表进行去重,然后再进行普通inner join,从而实现SEMI JOIN。

8018f75394135e043edc2cb88b3e868e.png

先将内表进行去重:可以通过group by进行聚合(hash agg或者sort agg)去重得到内表值;然后针对外表1,顺序扫描内表去重后的值11,不匹配,继续下一个值;下一个值是1,匹配,输出外表值1。针对Join的结果,内表因为去过重,所以满足join条件的必然只有一个值。

3、JOIN_DEDUP_SEMI/JOIN_DEDUP_SEMI_REVERSE

以上两种实现方式是沿用PgSQL,针对的是集中式实现方式。GPDB是分布式,当分布键不匹配时,就需要进行广播MOTION,即使每个segment上去过重,广播MOTION后仍旧可能存在重复值,这样就不能使用第2种实现方式。比如下面案例:第三种实现方式

postgres=# explain select * from s where exists (select 1 from r where s.a = r.b);QUERY PLAN                                                   
---------------------------------------------------------------------------------------------------------------
Gather Motion 3:1  (slice1; segments: 3)  (cost=153.50..155.83 rows=100 width=8)
->  HashAggregate  (cost=153.50..153.83 rows=34 width=8)Group Key: (RowIdExpr)->  Redistribute Motion 3:3  (slice2; segments: 3)  (cost=11.75..153.00 rows=34 width=8)Hash Key: (RowIdExpr)->  Hash Join  (cost=11.75..151.00 rows=34 width=8)Hash Cond: (r.b = s.a)->  Seq Scan on r  (cost=0.00..112.00 rows=3334 width=4)->  Hash  (cost=8.00..8.00 rows=100 width=8)->  Broadcast Motion 3:3  (slice3; segments: 3)  (cost=0.00..8.00 rows=100 width=8)->  Seq Scan on s  (cost=0.00..4.00 rows=34 width=8)
Optimizer: Postgres query optimizer
(12 rows)

分析:

1)上面案例s作为内表,r作为外表。s表远大于r表。s广播motion记录数量众多,代价非常大

2)Hash join构建hash表阶段进行去重

3)外表r不可以广播motion,否则会产生重复值

4)基于上述原因,只能选择广播大表进行JOIN_SEMI了

所以,GPDB实现了第3种方式,即先进行join,然后再去重。主要是为了能够广播小表,比如上述例子种的小表r(作为外表),即使产生重复值也可以在去重阶段去掉。

为了方便去重,GPDB引入了表达式RowIdExpr,即去重操作:DISTINCT ON (RowIdExpr)。该表达式为一条记录产生唯一标识值,附加到该记录中作为一个额外字段。广播后进行join,相对于JOIN_SEMI计划,多了一个重分布MOTION节点,当然MOTION的记录都非常少。上述例子中可以看到hash join后需要在RowIdExpr上进行重分布,然后再在RowIdExpr这个字段上通过Hash Agg进行去重。鉴于hash join前的广播分布和join后的重分布传输的记录数量都比较小,JOIN_DEDUP_SEMI实现方式就在三种实现方式中胜出了。

这篇关于GPDB技术内幕 - SEMI JOIN浅析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900254

相关文章

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技