postgresql 集合类型_全面解读PostgreSQL和Greenplum的Hash Join

本文详细介绍了PostgreSQL和Greenplum的Hash Join实现,包括Hash Join的工作原理、JOIN类型、经典算法及优化策略。通过实例分析了INNER JOIN、FULL OUTER JOIN、SEMI JOIN和ANTI JOIN等,探讨了Hash Join在处理大数据量时的优势,并讨论了Greenplum中Hash Join的特性和优化,包括分布式查询和并行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019年10月15日,Pivotal中国研发中心副总经理兼Greenplum中文社区发起人姚延栋出席了于意大利举行的PostgreSQL Conference Europe并发表了精彩的演讲《How does Hash Join work in PostgreSQL and its derivates》。本文根据演讲内容整理而成,供大家学习交流。

2f2e01e3ba7001ff6411d333be12b882.png

今天我将详细介绍PostgreSQL和Greenplum的Hashjoin。之所以会选择Hashjoin这个话题,是因为HashJoin是处理OLAP或者是分析型查询(analytics queries)的重要武器。首先,我们来看看 PostgreSQL 中的 Hashjoin 实现。

c17b042890828628c604894f7aab540f.png

在介绍HashJoin实现之前,首先了解下什么是 JOIN。根据维基百科(WIKIPedia),JOIN是关系数据库中组合一个或者多个表中的columns的算子。

8894aa7fd76476a77948494077290d87.png

而JOIN 有多种类型, SQL 标准中定义了 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 等四种类型,用集合论里的操作非常容易理解。 我们在下图直观的解释了这四种JOIN类型的效用。

此外还有其中JOIN类型,譬如 SEMI JOIN和 ANTI JOIN。 这两种JOIN不是 SQL 语法,然而通常用来实现某些 SQL 功能,后面会详细介绍他们。

a4a8af21f2d904d72ee782cadaf43654.png

本文将使用这样一个例子。 例子里面包含两张表:student表和score表,每张表都有几条记录。

c324db0ba444888905773b78946da4a7.png

首先我们看下图中JOIN对应的 SQL语句。 通过 explain 可以查看这6个SQL例子的JOIN类型。 (需要设置 enable_mergejoin, enable_hashagg 为 OFF,否则优化器可能会选择其他查询计划)

4e133ac0369c01065dac8ee36d39f0f2.png

下图展示了查询结果,让我们对图中JOIN的作用有个直观的认知。

49a4a2e4d0143cabc91999183e8f641f.png

JOIN 有三种经典的实现算法:Nested Loop、Merge JOIN、Hash Join。他们各有优缺点,譬如 Nest loop 通常性能不好,但是适用于任何类型的JOIN;Merge join对于排序的数据性能非常好;HashJoin对大数据量通常性能最好,但是只能处理equijoin,而不能处理譬如 c1 > c2 这样的join条件。

ea0c870cacf6c303c09f3f1ce2b9e7d2.png

Hashjoin 是一个经典算法,它包含2个phases,一个是 build phase,理想情况下对小表构建 hash table,该表通常也称为 inner table;第二个phase为 probe phase,扫描关联的另一张表的内容,并通过hash table 探测是否有匹配的行/元组,该表通常称为 outer table。

4abf0e507e1a7bed2e703d2ba10ff412.png

让我们先从 inner join入手。下图有一个inner join的例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值