Performance comparison with postgresql : left join vs union all

柔情痞子 提交于 2019-12-23 01:46:57

问题


I want to know what is the best and the fastest solution between a "left outer join" and an "union all". The database is a PostgreSQL.

Query with an UNION ALL :

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

Query with a LEFT OUTER JOIN :

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

回答1:


Your two queries may not produce the same result.

Your query with UNION ALL returns rows that matches plus rows that not matches because of a null value in elm_usr_id.

While the query with LEFT JOIN (same as LEFT OUTER JOIN) returns rows that matches plus rows that not matches because of any not corresponding value.

Regarding to this, the query with LEFT JOIN is more secure if you expect to see all rows.

Back to your original question, the query with LEFT JOIN is the best on for taking advantage of indexes. For example, if you'd like to have a sorted result, then the UNION query will be far slowest. Or if your query is a subquery in a main query, then the UNION will prevent any possible exploitation of table [element] indexes. So it will be slow to perform a JOIN or WHERE of such a subquery.




回答2:


I would suggest LEFT OUTER JOIN over union all in this particular scenario,

as in union all you have to read the tables twice, whereas in LEFT OUTER JOIN only once




回答3:


Probably the LEFT JOIN, but you can see the query plan by running EXPLAIN ANALYSE SELECT.... The UNION ALL form might be clearer if you were modifying columns based on the null-ness of elm_usr_id but you could always use CASE to do column modifications with a LEFT JOIN.



来源:https://stackoverflow.com/questions/12420950/performance-comparison-with-postgresql-left-join-vs-union-all

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!