我正在寻求优化我的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;
答案 0 :(得分:2)
运行时两个查询将完全相同。尝试运行前面带有explain analyze
的两个查询,您应该得到完全相同的查询计划。
简而言之,Postgres将解析查询并提出查询树。
然后在适当的时候重写查询树,删除多余的内容,例如1 = 1
where子句,替换小IN ()
子句或使用ANY
等效子句替换它或者,在您的情况下,将两个子查询折叠到父查询中。它之所以这样做是因为它基本上将它们视为select (select ...)
,而内部选择不受聚合,分组或限制条款的约束。
只有这样才能花一些时间分析查询树本身,以寻找它认为足够优化的查询计划。最后执行查询计划以返回您要求的行。
有关血腥的详细信息,您需要查看有关性能提示的Postgres手册,以及explain
和explain analyze
语法:
另请注意Postgres性能邮件列表,您可以在此处找到其存档:
研究它们是非常值得的,因为这样做可以为你提供关于幕后发生的事情的丰富见解。特别注意Tom Lane写的消息 - 他偶尔会给出查询重写器和计划器中发生的事情的第一手资料。