当前位置: fuhua-pet->PostgreSQL > PostgreSQL技术大讲堂 - 第30讲:多表连接方式

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

2023-10-11作者:fuhua-pet来源:www.fuhua-pet.com

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命令的结果如下所示

  • 大连财经学院 - 国产数据库工作室揭牌仪式圆满成功(CUUG)
  • 河北工程技术学院 - 国产数据库工作室揭牌仪式圆满成功
  • postgresql从小白到高手 - 第38讲:数据库备份
  • 11月18日直播!杭州峰会大咖晚宴煮酒论英雄+PG技术大讲堂(34)
  • 2023年12月,PostgreSQL认证培训红头文件【工信部人才交流中心】
  • 温州大学 - 开源国产数据库工作室成立揭牌仪式圆满结束
  • 1月17日阿里云PolarDB开发者大会PolarDB DevCon
  • 2024-1-12,恭喜CUUG 王同学获得Oracle OCP证书
  • 10月份PG考试的证书来啦!工信人才培训证书+认证证书!
  • PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
  • PostgreSQL技术大讲堂 - 第34讲:调优工具pgBagder部署
  • PostgreSQL技术大讲堂 - 第33讲:并行查询管理
  • PostgreSQL技术大讲堂 - 第31讲:SQL调优技巧
  • PostgreSQL PGCP是什么级别的认证?
  • PGCP中级认证考试的三个维度考核
  • postgresql技术大讲堂 - 第40讲:数据库不完全恢复
  • PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
  • Postgres社区创始人:关系型数据库的未来是光明的
  • 甲骨文基于PostgreSQL的OCI数据库即将登场
  • PostgreSQL技术大讲堂 - 第30讲:多表连接方式
  • PostgreSQL认证考试中心
  • 工信人才信创PG认证培训红头文件【2023年】
  • PostgreSQL认证证书(实图)
  • 国内PostgreSQL认证,工信部人才交流中心PG技术能力提升培训认证
  • 中国PostgreSQL技术能力培训认证
  • 10月25日,CUUG新鲜出炉的Oracle DB 19C OCP证书
  • 10月26日,CUUG新鲜出炉的Oracle DB 19C OCP证书
  • 揭秘Oracle全球数据库的威力:Oracle Database 23c的进步
  • postgresql从小白到高手 - 第37讲:postgres物理备份和恢复概述
  • postgresql从小白到高手 - 第36讲:postgresql逻辑备份
  • postgresql从小白到高手 - 第35讲:中间件PgBouncer部署
  • PostgreSQL PGCP是什么级别的认证?
  • PGCP中级认证考试的三个维度考核
  • 国内PostgreSQL认证,工信部人才交流中心PG技术能力提升培训认证
  • 11月27日,CUUG新鲜出炉的Oracle DB 19C OCP证书
  • Oracle 19c OCM认证好考吗?CUUG OCM成绩公布
  • Oracle 19c OCM认证考试成绩出炉!- CUUG WDP培训中心
  • 菏泽学院 - 国产数据库工作室揭牌仪式圆满成功
  • PostgreSQL技术大讲堂 - 第41讲:表空间备份与恢复
  • PostgreSQL技术大讲堂 - 第42讲:pg_rman部署与使用
  • PostgreSQL技术大讲堂 - 第43讲:流复制原理
  • 阿里云PolarDB开发者大会圆满结束,CUUG两次获奖
  • 2024年首张Oracle OCP证书-CUUG胡同学
  • 北京培黎职业学院 - PolarDB开源国产数据库工作室成立揭牌 - CUUG
  • 10月28日,PostgreSQL初级、中级认证考试顺利结束
  • 10月16日,昨天新鲜出炉的Oracle DB 19C OCP证书
  • PolarDB-X高可用与容灾(WIP)
  • PolarDB-X体系架构architecture
  • 什么是 PolarDB-X 云原生分布式数据库系统
  • postgresql技术大讲堂 - 第39讲:数据库完全恢复