一尘不染

与Postgresql的性能比较:左联接vs联合全部

sql

我想知道“左外部联接”和“全部联合”之间最好和最快的解决方案是什么。该数据库是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;

阅读 131

收藏
2021-05-16

共1个答案

一尘不染

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

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

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

与此相关,如果希望看到所有行,则使用LEFT JOIN的查询会更安全。

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

2021-05-16