本文共 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/