PostgreSQL技术大讲堂 - 第30讲:多表连接方式

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 从零开始学PostgreSQL技术大讲堂 - 第30讲:多表连接方式


PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。


第30讲:多表连接方式


第30讲预告:9月23日(周六)19:30-20:30,钉钉群直播,群号:35822460

内容1 : Nested Loop Join连接方式

内容2 : Merge Join连接方式

内容3 : Hash Join连接方式


多表连接方式

多表连接方式

三种连接方式:

nested loop join

merge join

hash join

支持所有join操作:

NATURAL INNER JOIN

INNER JOIN

LEFT/RIGHT OUTER JOIN

FULL OUTER JOIN


嵌套循环连接方式

Nested Loop Join

嵌套循环联接是最基本的联接操作,它可以用于任何联接条件。




Nested Loop Join图解




Materialized Nested Loop Join



我们使用下面的具体示例来探索执行器如何处理具体化嵌套循环连接的计划树,以及如何估计成本。

testdb=# EXPLAIN SELECT * FROM tbl_a AS a, tbl_b AS b WHERE a.id = b.id;

QUERY PLAN

-----------------------------------------------------------------------

Nested Loop (cost=0.00..750230.50 rows=5000 width=16)

Join Filter: (a.id = b.id)

-> Seq Scan on tbl_a a (cost=0.00..145.00 rows=10000 width=8)

-> Materialize (cost=0.00..98.00 rows=5000 width=8)

-> Seq Scan on tbl_b b (cost=0.00..73.00 rows=5000 width=8)

(5 rows)


Materialize成本估算



(Materialized) Nested Loop成本估算




Indexed Nested Loop Join



testdb=# EXPLAIN SELECT * FROM tbl_c AS c, tbl_b AS b WHERE c.id = b.id;

QUERY PLAN

--------------------------------------------------------------------------------

Nested Loop (cost=0.29..1935.50 rows=5000 width=16)

-> Seq Scan on tbl_b b (cost=0.00..73.00 rows=5000 width=8)

-> Index Scan using tbl_c_pkey on tbl_c c (cost=0.29..0.36 rows=1 width=8)

Index Cond:(id=b.id)

(4 rows)


具有外部索引扫描的嵌套循环联接的三种变体



Merge Join连接方式

Merge Join




Merge Join成本估算



testdb=# EXPLAIN SELECT * FROM tbl_a AS a, tbl_b AS b WHERE a.id = b.id AND b.id < 1000;

QUERY PLAN

-------------------------------------------------------------------------

Merge Join (cost=944.71..984.71 rows=1000 width=16)

Merge Cond: (a.id = b.id)

-> Sort (cost=809.39..834.39 rows=10000 width=8)

Sort Key: a.id

-> Seq Scan on tbl_a a (cost=0.00..145.00 rows=10000 width=8)

-> Sort (cost=135.33..137.83 rows=1000 width=8)

Sort Key: b.id

-> Seq Scan on tbl_b b (cost=0.00..85.50 rows=1000 width=8)

Filter: (id < 1000)

(9 rows)


Materialized Merge Join




Other Variations



强制使用merge join

testdb=# SET enable_hashjoin TO off;

testdb=# SET enable_nestloop TO off;

testdb=# EXPLAIN SELECT * FROM tbl_c AS c, tbl_b AS b WHERE c.id = b.id AND b.id < 1000;

QUERY PLAN

--------------------------------------------------------------------------------------

Merge Join (cost=135.61..322.11 rows=1000 width=16)

Merge Cond: (c.id = b.id)

-> Index Scan using tbl_c_pkey on tbl_c c (cost=0.29..318.29 rows=10000 width=8)

-> Sort (cost=135.33..137.83 rows=1000 width=8)

Sort Key: b.id

-> Seq Scan on tbl_b b (cost=0.00..85.50 rows=1000 width=8)

Filter: (id < 1000)

(7 rows)


materialized merge join with outer index scan

testdb=# SET enable_hashjoin TO off;

testdb=# SET enable_nestloop TO off;

testdb=# EXPLAIN SELECT * FROM tbl_c AS c, tbl_b AS b WHERE c.id = b.id AND b.id < 4500;

QUERY PLAN

--------------------------------------------------------------------------------------

Merge Join (cost=421.84..672.09 rows=4500 width=16)

Merge Cond: (c.id = b.id)

-> Index Scan using tbl_c_pkey on tbl_c c (cost=0.29..318.29 rows=10000 width=8)

-> Materialize (cost=421.55..444.05 rows=4500 width=8)

-> Sort (cost=421.55..432.80 rows=4500 width=8)

Sort Key: b.id

-> Seq Scan on tbl_b b (cost=0.00..85.50 rows=4500 width=8)

Filter: (id < 4500)

(8 rows)


indexed merge join with outer index scan

testdb=# SET enable_hashjoin TO off;

testdb=# SET enable_nestloop TO off;

testdb=# EXPLAIN SELECT * FROM tbl_c AS c, tbl_d AS d WHERE c.id = d.id AND d.id < 1000;

QUERY PLAN

--------------------------------------------------------------------------------------

Merge Join (cost=0.57..226.07 rows=1000 width=16)

Merge Cond: (c.id = d.id)

-> Index Scan using tbl_c_pkey on tbl_c c (cost=0.29..318.29 rows=10000 width=8)

-> Index Scan using tbl_d_pkey on tbl_d d (cost=0.28..41.78 rows=1000 width=8)

Index Cond: (id < 1000)

(5 rows)


Hash Join连接方式

Hash Join



In-Memory Hash Join

构建阶段:

将内部表的所有元组插入到一个批处理中

探测阶段:

将外部表的每个元组与批处理中的内部元组进行比较,如果满足连接条件,则进行连接


Hash Join




计划器处理转变

预处理

1、计划和转换CTE(如果查询中带有with列表,则计划器通过SS_process_ctes()函数处理每个with查询)

2、向上拉子查询

根据子查询的特点,改为自然连接查询。

testdb=# SELECT * FROM tbl_a AS a, (SELECT * FROM tbl_b) as b WHERE a.id = b.id;

testdb=# SELECT * FROM tbl_a AS a, tbl_b as b WHERE a.id = b.id;

3、将外部联接转换为内部联接


优化器可用规则

Getting the Cheapest Path

1、表数量小于12张,应用动态规划得到最优的计划

2、表数量大于12张,应用遗传查询优化器

参数 geqo_threshold指定的阈值(默认值为12)

3、分为不同的级别层次来处理


多表查询连接顺序选择

SGetting the Cheapest Path of a Triple-Table Query

testdb=# SELECT * FROM tbl_a AS a, tbl_b AS b, tbl_c AS c

testdb=# WHERE a.id = b.id AND b.id = c.id AND a.data < 40;

考虑3种组合:

{tbl_a,tbl_b,tbl_c}=min({tbl_a,{tbl_b,tbl_c}},{tbl_b,{tbl_a,tbl_c}},{tbl_c,{tbl_a,tbl_b}}).

创建多表查询的计划树· 此查询的EXPLAIN命令的结果如下所示



相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
1月前
|
Cloud Native 关系型数据库 分布式数据库
开发者视角看云原生数据库一体化技术趋势
随着云原生数据库技术的不断发展,一体化数据库解决方案成为技术圈的热点,云原生数据库一体化技术是当前数据库领域的重要趋势,对于开发者而言,学习理解和应对这一趋势,对于业务开发的成功实施非常重要。比如,阿里云瑶池数据库和PolarDB-X等产品通过离在线一体化、处理分析一体化和集中分布一体化等创新理念,引领了数据库领域的新变革。那么本文就来从开发者的角度探讨云原生数据库一体化技术趋势,并分析在业务处理分析一体化、集中式与分布式数据库边界模糊和云原生一体化数据库的选择等方面的影响。
194 4
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云PolarDB登顶2024中国数据库流行榜:技术实力与开发者影响力
近日,阿里云旗下的自研云原生数据库PolarDB在2024年中国数据库流行度排行榜中夺冠,并刷新了榜单总分纪录,这一成就引起了技术圈的广泛关注。这一成就源于PolarDB在数据库技术上的突破与创新,以及对开发者和用户的实际需求的深入了解体会。那么本文就来分享一下关于数据库流行度排行榜的影响力以及对数据库选型的影响,讨论PolarDB登顶的关键因素,以及PolarDB“三层分离”新版本对开发者使用数据库的影响。
82 3
阿里云PolarDB登顶2024中国数据库流行榜:技术实力与开发者影响力
|
5月前
|
消息中间件 存储 关系型数据库
PostgreSQL技术大讲堂 - 第33讲:并行查询管理
PostgreSQL从小白到专家,技术大讲堂 - 第33讲:并行查询管理
289 1
|
4月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版并行查询技术探索与实践
PolarDB MySQL版并行查询技术探索与实践 PolarDB MySQL版在企业级查询加速特性上进行了深度技术探索,其中并行查询作为其重要组成部分,已经在线稳定运行多年,持续演进。本文将详细介绍并行查询的背景、挑战、方案、特性以及实践。
109 2
|
5月前
|
关系型数据库 PostgreSQL
解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
428 0
|
1月前
|
Cloud Native OLAP OLTP
如何看待云原生数据库一体化的技术趋势?
面对业务处理分析一体化,开发者需平衡OLTP和OLAP数据库需求。关键在于理解业务目标,选择适合的数据库:OLTP注重高并发、低延迟,如MySQL、PostgreSQL;OLAP侧重复杂查询和数据聚合,如Greenplum、ClickHouse。云原生数据库提供弹性扩展和容灾能力。数据同步、一致性、安全性和合规性也是重要考量因素。开发者应持续关注新技术,以适应不断变化的业务需求。
|
1月前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
【2月更文挑战第16天】PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
27 1
|
2月前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因
【2月更文挑战第5天】PolarDB for MySQL数据库外网连接解析失败的原因
66 8
|
2月前
|
关系型数据库 分布式数据库 数据库
PolarDB for PostgreSQL报错问题之psql连接数据库报错如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
|
3月前
|
关系型数据库 分布式数据库 数据库
业界声音|PolarDB最值得关注的技术创新有哪些?
"PolarDB一路走来,见证了国产数据库发展的不平凡之路。"
业界声音|PolarDB最值得关注的技术创新有哪些?

相关产品

  • 云原生数据库 PolarDB