博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第05课:连接顺序交换规则
阅读量:4074 次
发布时间:2019-05-25

本文共 832 字,大约阅读时间需要 2 分钟。

没有规矩,不成方圆。我们在编写 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 Cpostgres=# EXPLAIN SELECT * FROM (TEST_A LEFT JOIN TEST_B ON TRUE) LEFT JOIN TEST_C ON TEST_B.a = TEST_C.a;                                  QUERY PLAN------------------------------------------------------------------------------- Nested Loop Left Join  (cost=1.11..16.

转载地址:http://boyni.baihongyu.com/

你可能感兴趣的文章
SQL语句(二)查询语句
查看>>
SQL语句(六) 自主存取控制
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
堆排序完整版,含注释
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
PostgreSQL代码分析,查询优化部分,process_duplicate_ors
查看>>
PostgreSQL代码分析,查询优化部分,canonicalize_qual
查看>>
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
查看>>
IA32时钟周期的一些内容
查看>>
获得github工程中的一个文件夹的方法
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>
PostgreSQL查询优化器详解之逻辑优化篇
查看>>
STM32中assert_param的使用
查看>>
C语言中的 (void*)0 与 (void)0
查看>>
vu 是什么
查看>>
io口的作用
查看>>
IO口的作用
查看>>
UIView的使用setNeedsDisplay
查看>>
归档与解归档
查看>>