与postgresql的性能比较:left join vs union all

时间:2012-09-14 08:44:16

标签: sql postgresql join union

我想知道“左外连接”和“全部连接”之间的最佳和最快解决方案是什么。 该数据库是PostgreSQL。

使用UNION ALL查询:

SELECT * FROM element, user WHERE elm_usr_id = usr_id
UNION ALL
SELECT * FROM element WHERE elm_usr_id ISNULL;

使用LEFT OUTER JOIN进行查询:

SELECT * FROM element LEFT OUTER JOIN user ON elm_usr_id = usr_id;

3 个答案:

答案 0 :(得分:1)

我建议在这个特定情况下,LEFT OUTER JOIN over union all,

就像在联合中所有你必须阅读两次表,而在LEFT OUTER JOIN中只需要一次

答案 1 :(得分:1)

可能是LEFT JOIN,但您可以通过运行EXPLAIN ANALYSE SELECT...来查看查询计划。如果您根据elm_usr_id的null-ress修改列,则UNION ALL表单可能会更清晰,但您始终可以使用CASE通过LEFT JOIN进行列修改。

答案 2 :(得分:1)

您的两个查询可能不会产生相同的结果。

使用UNION ALL的查询返回匹配的行以及由于elm_usr_id中的空值而不匹配的行。

使用LEFT JOIN的查询(与LEFT OUTER JOIN相同)返回匹配的行以及由于任何不对应的值而不匹配的行。

对此,如果您希望查看所有行,则使用LEFT JOIN的查询会更安全。

回到原来的问题,使用LEFT JOIN的查询是利用索引的最佳选择。例如,如果您想要排序结果,那么UNION查询将是最慢的。或者,如果您的查询是主查询中的子查询,则UNION将阻止对表[element]索引的任何可能利用。因此,执行此类子查询的JOIN或WHERE将会很慢。