10

我有两个查询,UNION我已经知道这两个查询之间不会有重复的元素。因此,UNIONUNION ALL会产生相同的结果。

我应该使用哪一个?

4

5 回答 5

24

您应该使用与您正在寻找的意图相匹配的那个。如果要确保没有重复使用UNION,否则使用UNION ALL. 仅仅因为您的数据现在会产生相同的结果并不意味着它总是会产生相同的结果。

也就是说,UNION ALL在任何健全的数据库实现上都会更快,请参阅下面的文章以获取示例。但通常情况下,它们是相同的,只是UNION执​​行了一个额外的步骤来删除相同的行(正如人们可能期望的那样),并且它可能倾向于支配执行时间。

于 2010-10-11T20:12:22.020 回答
6

我看到你已经标记了这个问题性能,所以我认为这是你的主要考虑因素。

UNION ALL将绝对优于UNIONSQL 不必检查这两组重复。

除非您需要 SQL 为您执行重复检查,否则请始终使用UNION ALL.

于 2010-10-11T20:15:26.430 回答
2

UNION ALL反正我会用。即使知道不会有重复,但取决于您的数据库服务器引擎,它可能不知道这一点。

因此,只是为了向数据库服务器提供额外的信息,以便其查询计划器(可能)有更好的选择,请使用UNION ALL.

话虽如此,如果您的DB server的查询计划器足够聪明,可以从UNION子句和表索引中推断出该信息,那么结果(性能和语义方面)应该是相同的。

无论哪种情况,它都很大程度上取决于您使用的数据库服务器。

于 2010-10-11T20:13:29.797 回答
2

根据http://blog.sqlauthority.com/2007/03/10/sql-server-union-vs-union-all-which-is-better-for-performance/至少对于性能来说最好使用 UNION ALL,因为它不会主动区分重复项,因此速度更快

于 2010-10-11T20:13:45.723 回答
1

由于两者不会重复,因此使用 UNION ALL。您无需检查重复项,UNION ALL 将更有效地执行任务。

于 2010-10-11T20:32:33.850 回答