UNION
删除重复记录(结果中的所有列都相同), UNION ALL
不会。
使用UNION
而不是UNION ALL
时会出现性能UNION ALL
,因为数据库服务器必须执行其他工作才能删除重复的行,但通常您不需要重复项(特别是在开发报表时)。
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
结果:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
结果:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
UNION 和 UNION ALL 都会连接两个不同的 SQL 的结果。它们处理重复的方式不同。
UNION 对结果集执行 DISTINCT,消除任何重复的行。
UNION ALL 不会删除重复项,因此它比 UNION 更快。
注意:使用此命令时,所有选定列都必须具有相同的数据类型。
示例:如果我们有两个表,1)Employee 和 2)Customer
UNION
删除重复项,而UNION ALL
则不删除重复项。
为了删除重复项,必须对结果集进行排序,这可能会对 UNION 的性能产生影响,具体取决于要排序的数据量以及各种 RDBMS 参数的设置(对于 Oracle PGA_AGGREGATE_TARGET
其中WORKAREA_SIZE_POLICY=AUTO
或如果WORKAREA_SIZE_POLICY=MANUAL
, SOR_AREA_RETAINED_SIZE
SORT_AREA_SIZE
和SOR_AREA_RETAINED_SIZE
。
基本上,如果它可以在内存中执行,那么排序会更快,但同样适用于数据量的警告。
当然,如果您需要返回没有重复的数据,那么您必须使用 UNION,具体取决于数据的来源。
我会对第一篇文章发表评论,以评定 “性能低得多” 的评论,但没有足够的声誉(积分)这样做。