鉴于此查询,
SELECT a.*
FROM a
LEFT JOIN b ON b.a_id = a.id
LEFT JOIN c ON c.a_id = a.id
HAVING COUNT(DISTINCT b.id) < COUNT(DISTINCT c.id)
如果 b 是一个比 c 大得多的表,我执行连接的顺序是否会对性能产生影响?我在某处读到经验法则是从最小到最大连接,但这可能指的是 INNER JOIN。
我意识到在许多情况下结果将取决于外部连接的顺序,但在像上面这样的顺序对准确性无关紧要的情况下,它是否会影响性能?
SQL 是声明性语言,查询不会按照您编写的方式执行。大多数现代 RDMS 都有不错的优化器,当涉及的表数量相对较少、统计信息是最新的、数据不倾斜、存在适当的索引等时,它能够选择正确的连接顺序。
查询优化是一个非常广泛的话题,而且它对特定的供应商来说非常具体。它可能涉及添加提示、创建物化视图、使用固定的执行计划、在内存中缓存表以及许多其他事情。在某种程度上,您可以通过编写查询的方式来控制连接顺序(例如,
WITH
与内联视图中的相同子查询相比,内部子查询更有可能首先执行,但同样,它非常特定于您正在使用的 RDMS。根据我的经验,我建议从一个能给你预期结果的查询开始,并且只有在它很慢的时候才尝试优化它——优化器会做剩下的事情。
旁注:
COUNT
可以出现在HAVING
从句中,而不是出现在WHERE
;查询将在大多数 RDMS 上失败。