第05课:连接顺序交换规则

本文探讨了数据库查询优化中的连接顺序交换规则,通过示例解释了在内连接、左外连接、Semi Join和Anti Join情况下,如何通过交换表的连接顺序来优化执行计划。PostgreSQL数据库在特定条件下允许这样的交换,以寻找更优的查询路径。文章强调了理解这些规则的重要性,并鼓励读者通过实践加深理解。

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

没有规矩,不成方圆。我们在编写 SQL 语句的时候,通常都会绞尽脑汁地想写出一个性能比较好的语句。对于如何安排表之间的连接顺序,也都是经过深思熟虑的。但是人脑毕竟不是电脑,我们在安排表之间的连接顺序时,能够考虑到的因素也有限。而且,数据库内的数据情况瞬息万变,在不同的时间节点,同样的连接顺序可能需要消耗不同数量的资源。因此,对表的连接顺序进行重新排列是一个非常重要的优化过程。

请看下面示例中的 SQL 语句,如果从连接条件下推的角度来看,TEST_B.a = TEST_C.a 是无法下推的,因为它引用了 Nonnullable-side 的表(这里把 TEST_A LEFT JOIN TEST_B ON TRUE 看做一个整体)。但是通过查看下面 SQL 语句的执行计划会发现执行计划改变了表之间的连接顺序,由原来的 (TEST_A LEFT JOIN TEST_B ON TRUE) LEFT JOIN TEST_C ON TEST_B.a = TEST_C.a 变成了 TEST_A LEFT JOIN (TEST_B LEFT JOIN TEST_C ON TEST_B.a = TEST_C.a) ON TRUE,使得连接条件同样地下降了一层。

-- ( A LEFT JOIN B ) LEFT JOIN C
postgres=# EXPLAIN SELECT * FROM (TEST_A LEFT JOIN TEST_B ON TRUE) LEFT JOIN TES
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值