加入子查询结果性能

时间:2014-12-02 13:21:59

标签: sql performance postgresql

我正在寻求优化我的SQL查询,并希望知道,在优化性能方面,如果

SELECT A.this, B.another FROM A
JOIN B 
ON A.this = B.that
WHERE B.another > 6
AND A.something < 3;

优于:

SELECT A.this, B.another 
FROM (SELECT this FROM A WHERE A.something < 3) AS A
JOIN (SELECT another FROM B WHERE B.another > 6) AS B
ON A.this = B.that;

1 个答案:

答案 0 :(得分:2)

运行时两个查询将完全相同。尝试运行前面带有explain analyze的两个查询,您应该得到完全相同的查询计划。

简而言之,Postgres将解析查询并提出查询树。

然后在适当的时候重写查询树,删除多余的内容,例如1 = 1 where子句,替换小IN ()子句或使用ANY等效子句替换它或者,在您的情况下,将两个子查询折叠到父查询中。它之所以这样做是因为它基本上将它们视为select (select ...),而内部选择不受聚合,分组或限制条款的约束。

只有这样才能花一些时间分析查询树本身,以寻找它认为足够优化的查询计划。最后执行查询计划以返回您要求的行。

有关血腥的详细信息,您需要查看有关性能提示的Postgres手册,以及explainexplain analyze语法:

另请注意Postgres性能邮件列表,您可以在此处找到其存档:

研究它们是非常值得的,因为这样做可以为你提供关于幕后发生的事情的丰富见解。特别注意Tom Lane写的消息 - 他偶尔会给出查询重写器和计划器中发生的事情的第一手资料。