UNION和UNION ALL之间的区别是什么?


当前回答

UNION和UNION ALL都连接两个不同SQL的结果。它们处理重复项的方式不同。

UNION对结果集执行DISTINCT,消除所有重复的行。UNION ALL不删除重复项,因此它比UNION更快。

注意:使用此命令时,所有选定的列都需要具有相同的数据类型。

示例:如果我们有两个表,1)员工和2)客户

员工表数据:

客户表数据:

UNION示例(它删除所有重复记录):

UNION ALL示例(它只是连接记录,而不是消除重复,因此比UNION更快):

其他回答

通过运行如下查询,您可以避免重复,并且运行速度仍然比UNION DISTINCT(实际上与UNION相同)快得多:

SELECT*FROM mytable WHERE a=X UNION ALL SELECT*FROM mytable WHERE b=Y AND a=十、

注意AND a=X部分。这比UNION快得多。

UNION和UNION ALL都连接两个不同SQL的结果。它们处理重复项的方式不同。

UNION对结果集执行DISTINCT,消除所有重复的行。UNION ALL不删除重复项,因此它比UNION更快。

注意:使用此命令时,所有选定的列都需要具有相同的数据类型。

示例:如果我们有两个表,1)员工和2)客户

员工表数据:

客户表数据:

UNION示例(它删除所有重复记录):

UNION ALL示例(它只是连接记录,而不是消除重复,因此比UNION更快):

UNION删除重复项,而UNION ALL不删除重复项。

为了删除重复项,必须对结果集进行排序,这可能会影响UNION的性能,具体取决于要排序的数据量和各种RDBMS参数的设置(对于具有WORKAREA_SIZE_POLICY=AUTO或SORT_AREA_SIZE_SIZE和SOR_AREA_RETAINED_SIZE的Oracle PGA_AGGREGATE_TARGET,如果WORKARE_ASIZE_PPOLICY=MANUAL)。

基本上,如果排序可以在内存中执行,那么排序速度会更快,但关于数据量的警告同样适用。

当然,如果需要返回没有重复的数据,则必须使用UNION,具体取决于数据的来源。

我会在第一篇文章中评论“表现差得多”的评论,但没有足够的声誉(分数)。

在ORACLE:UNION不支持BLOB(或CLOB)列类型,UNION ALL支持。

UNION-在UNION ALL-生成包括重复项在内的所有记录。

两者都是阻塞运算符,因此我个人更喜欢在任何时候使用JOIN而不是阻塞运算符(UNION、INTERSECT、UNION ALL等)。

为了说明为什么Union操作与Union All相比执行得很差,请执行以下示例。

CREATE TABLE #T1 (data VARCHAR(10))

INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'


CREATE TABLE #T2 (data VARCHAR(10))

INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'

以下是UNION ALL和UNION操作的结果。

UNION语句有效地对结果集执行SELECT DISTINCT。如果您知道从联合返回的所有记录都是唯一的,请改用union all,这样可以更快地获得结果。

使用UNION会导致执行计划中的不同排序操作。证明该声明的证据如下: