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

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

2023-10-11作者:fljsyy来源:www.fljsyy.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命令的结果如下所示

  • IBM Informix数据库
  • MySQL 8.0 OCP认证考试题库持续更新
  • 海若向量数据库HaiRuo VectorDB
  • 瀚高数据库HIGHGO
  • 鸿蒙PC正式发布,有望加速数据库国产化进程
  • 巨杉数据库SequoiaDB
  • 万里数据库GreatDB
  • PostgreSQL 17.5、16.9、15.13、14.18 和 13.21 发布!
  • PostgreSQL 18 测试版Beta 1 发布,新功能新特性!
  • PostgreSQL技术大讲堂 - 第89讲:重讲数据库完全恢复
  • PostgreSQL技术大讲堂 - 第90讲:重讲数据库不完全恢复
  • PostgreSQL证书有效期是几年
  • 学PostgreSQL技术,考工信部人才交流中心PG认证证书
  • OCM考试多少分及格?看看CUUG 张同学Oracle 19c OCM成绩单
  • 高校信创数据库人才培养创新与变革暨天职师大数据库教学平台国产化替代院长峰会
  • 六六大顺!2025年6月6日李同学OCP 19c认证证书
  • 腾讯云TCCA认证考试报名 - TDSQL数据库交付运维工程师(MySQL版)
  • 腾讯云TCCA认证考试报名 - TDSQL数据库交付运维工程师(PostgreSQL版)
  • 腾讯云TCCP认证考试报名 - TDSQL数据库交付运维高级工程师(MySQL版)
  • 腾讯云TCCP认证考试报名 - TDSQL数据库交付运维高级工程师(PostgreSQL版)
  • Easysearch分布式搜索型数据库
  • IvorySQL数据库
  • NebulaGraph数据库
  • OCP认证考试指南:费用、大纲、备考、题库、证书及有效期全面解析
  • SelectDB数据库
  • SourceDB数据库
  • SQLite数据库
  • Apache HBase数据库
  • 2025年5月安同学PostgreSQL PGCP中级认证证书
  • 2025年5月陈同学PostgreSQL PGCP中级认证证书
  • 2025年5月份工信部人才交流中心PostgreSQL认证证书
  • 2025年5月胡同学PostgreSQL PGCP中级认证证书
  • 2025年5月李同学PostgreSQL PGCM高级认证证书
  • 2025年5月李同学PostgreSQL PGCP中级认证证书
  • 2025年5月王同学PostgreSQL PGCP中级认证证书
  • 2025年5月赵同学PostgreSQL PGCM高级认证证书
  • PostgreSQL技术大讲堂 - 第91讲:重讲表空间恢复
  • PostgreSQL认证培训考试中心,及证书查询网址
  • PostgreSQL相比Oracle有哪些优势
  • 2025年5月30日证书,恭喜CUUG张同学通过OCM19c认证
  • CUUG入选2025年首批IITC工信人才岗位能力评价业务信息技术应用创新领域合作机构
  • PostgreSQL技术大讲堂 - 第92讲:重讲流复制原理
  • 河北建筑工程学院与北京优技教育(CUUG)达成产教整合校企合作
  • 推荐哪一家PostgreSQL认证?来看看工信部直属人才交流中心的PG认证
  • 信创PostgreSQL培训考试认证中心 -- 工信部人才交流中心唯一指定
  • 6月6日证书 - 工信部人才交流中心PostgreSQL中级PGCP高级PGCM认证
  • PostgreSQL从入门到精通教程- 第93讲:重讲pg流复制安装部署
  • OCP认证指南:学什么内容、考什么内容
  • PostgreSQL认证怎么选?PGCP中级认证PGCM高级认证
  • PostgreSQL数据库培训+认证+考试 - 工业和信息化部人才交流中心