我有两个查询,我UNION
在一起,这样我已经知道两个查询之间不会有重复的元素。因此,UNION
和UNION ALL
会产生相同的结果。
我应该使用哪一个?
答案 0 :(得分:23)
您应该使用符合您要求的意图的那个。如果您想确保没有重复项,请使用UNION
,否则请使用UNION ALL
。仅仅因为您的数据会产生相同的结果现在并不意味着它总是会。
也就是说,UNION ALL
在任何理智的数据库实现上都会更快,请参阅下面的文章以获取示例。但通常情况下,它们是相同的,除了UNION
执行额外的步骤来删除相同的行(正如人们所预期的那样),并且它可能倾向于占据执行时间。
答案 1 :(得分:6)
我看到你已经标记了这个问题的性能,所以我认为这是你的主要考虑因素。
UNION ALL
绝对优于UNION
,因为SQL不必检查这两个副本集。
除非您需要SQL来为您执行重复检查,否则请始终使用UNION ALL
。
答案 2 :(得分:2)
根据http://blog.sqlauthority.com/2007/03/10/sql-server-union-vs-union-all-which-is-better-for-performance/至少对于性能而言,最好使用UNION ALL,因为它不会主动区分重复项,因此更快
答案 3 :(得分:1)
无论如何我会使用UNION ALL
。即使你知道不会有重复项,但根据您的数据库服务器引擎,它可能不知道。
因此,只是为了向DB服务器提供额外的信息,为了使其查询计划器成为更好的选择(可能),请使用UNION ALL
。
话虽如此,如果您的数据库服务器的查询规划器足够聪明,可以从UNION
子句和表索引推断出该信息,那么结果(性能和语义方面)应该是一样的。
这两种情况都非常依赖于您正在使用的数据库服务器。
答案 4 :(得分:1)
由于两者不会重复使用UNION ALL。您不需要检查重复项,UNION ALL将更有效地执行任务。