优化常规连接SQL查询

时间:2014-10-24 01:47:03

标签: sql postgresql optimization query-optimization

如何优化SQL查询的速度,如下所示:

select ... from TABLE 
  left join TABLE2 on TABLE2.COL2 = TABLE.COL 
  left join TABLE3 on TABLE3.COL2 = TABLE2.COL
  etc.

我从SQL(正是Postgres)的角度提出要求,例如:连接的顺序是否重要?子查询或CTE有帮助吗?联接的类型是否重要?

我不是从数据库实现的角度来询问,例如索引,表空间,配置变量等

1 个答案:

答案 0 :(得分:1)

理论上,连接的顺序无关紧要,因为内置查询优化器应该将连接数限制在结果集的体积之前,以限制对体积影响较小的结果集。 然而,在我的实践中,我了解到最好尽可能多地尝试帮助提高性能,并在限制较少的连接之前设置更严格的连接。
所以一般来说,在查询优化器上中继的次数越多,边缘情况下的性能就越好。

在这里,您可以了解有关查询优化器的更多信息:http://www.postgresql.org/docs/9.1/static/runtime-config-query.html#RUNTIME-CONFIG-QUERY-GEQO

使用join的拇指规则应该比CTE或子查询更快,但这只是一个规则,但仍然可以例外。
还有一些问题需要连接和CTE。

这是一个杀人问题:Does the type of join matter?
是的,它确实!实际上这很重要最重要的是! :)
在这里,您可以看到不同联接类型背后的想法:http://en.wikipedia.org/wiki/Join_(SQL)

对于左右连接,这两个语句是相同的:
... table1 LEFT JOIN table2 ...
... table2 RIGHT JOIN table1 ...

左右外连接在功能上是等效的。两者都没有提供任何其他功能,因此只要切换表顺序,右外连接和左外连接就可以互相替换。