Jim*_*rte 1666
UNION删除重复记录(结果中的所有列都相同),UNION ALL不会.
使用时,有一个性能命中UNION,而不是UNION ALL,因为数据库服务器必须做更多的工作,以去除重复行,但通常你不想重复的(特别是当发展报告).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Run Code Online (Sandbox Code Playgroud)
结果:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Run Code Online (Sandbox Code Playgroud)
结果:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
Bha*_*tel 271
UNION和UNION ALL都会连接两个不同的SQL的结果.它们处理重复的方式不同.
UNION对结果集执行DISTINCT,消除任何重复的行.
UNION ALL不会删除重复项,因此它比UNION更快.
注意:使用此命令时,所有选定列都必须具有相同的数据类型.
示例:如果我们有两个表,1)Employee和2)Customer




小智 47
UNION删除重复项,而UNION ALL不是.
为了删除重复的结果集必须进行排序,并且这可能对UNION的性能的影响,这取决于数据的体积进行排序,以及各种RDBMS参数(对于Oracle的设置PGA_AGGREGATE_TARGET与WORKAREA_SIZE_POLICY=AUTO或SORT_AREA_SIZE和SOR_AREA_RETAINED_SIZE如果WORKAREA_SIZE_POLICY=MANUAL).
基本上,如果它可以在内存中执行,那么排序会更快,但同样适用于数据量的警告.
当然,如果您需要返回没有重复的数据,那么您必须使用UNION,具体取决于数据的来源.
我会对第一篇文章发表评论,以评定"性能低得多"的评论,但没有足够的声誉(积分)这样做.
Geo*_*uer 21
UNION和UNION ALL之间的基本区别是union操作消除了结果集中的重复行,但union all在加入后返回所有行.
来自http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
Iho*_*nov 13
您可以通过运行以下命令来避免重复并且仍然比UNION DISTINCT(实际上与UNION相同)运行得快得多:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
请注意该AND a!=X部分.这比UNION快得多.
Pet*_*háč 11
只是为了在这里讨论加上我的两分钱:人们可以将UNION运算符理解为纯粹的,面向SET的UNION - 例如集合A = {2,4,6,8},集合B = {1,2,3,4 ,A UNION B = {1,2,3,4,6,8}
当套打交道,你不希望号2和4出现两次,作为一个元素或者是或不是一组.
但是,在SQL世界中,您可能希望在一个"包"{2,4,6,8,1,2,3,4}中看到两个集合中的所有元素.为此,T-SQL为运营商提供服务UNION ALL.
小智 10
UNION
该UNION命令用于从两个表中选择相关信息,与JOIN命令非常相似.但是,使用该UNION命令时,所有选定列都必须具有相同的数据类型.使用时UNION,仅选择不同的值.
UNION ALL
的UNION ALL命令等于UNION命令,不同之处在于UNION ALL选择的所有值.
之间的区别Union和Union all是Union all不会消除重复行,而是刚刚从适合您查询具体的所有表中提取所有行并将它们组合成一个表.
一个UNION语句有效地做一个SELECT DISTINCT对结果集.如果您知道返回的所有记录都是您的联合中唯一的,那么请使用UNION ALL它来提供更快的结果.
不确定哪个数据库很重要
UNION并且UNION ALL应该适用于所有SQL Server.
你应该避免不必要UNION的,他们是巨大的性能泄漏.根据经验,UNION ALL如果您不确定使用哪个,请使用.
小智 6
UNION -导致不同的记录
,而
UNION ALL -结果中的所有记录,包括重复.
两者都是阻塞运算符,因此我个人更喜欢在阻塞运算符(UNION,INTERSECT,UNION ALL等)上使用JOINS.
为了说明为什么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'
Run Code Online (Sandbox Code Playgroud)
以下是UNION ALL和UNION操作的结果.
UNION语句有效地对结果集执行SELECT DISTINCT.如果您知道返回的所有记录都是您的联合中唯一的,请改用UNION ALL,它会提供更快的结果.
使用UNION会在执行计划中产生不同的排序操作.证明此声明的证据如下所示:
(来自Microsoft SQL Server联机丛书)
UNION [全部]
指定要组合多个结果集并将其作为单个结果集返回.
所有
将所有行合并到结果中.这包括重复.如果未指定,则删除重复的行.
UNION将花费太长时间,因为DISTINCT在结果上应用了重复的行.
SELECT * FROM Table1
UNION
SELECT * FROM Table2
Run Code Online (Sandbox Code Playgroud)
相当于:
SELECT DISTINCT * FROM (
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2) DT
Run Code Online (Sandbox Code Playgroud)
应用
DISTINCT结果的副作用是对结果进行排序操作.
UNION ALL结果将显示为结果的任意顺序但UNION结果将显示为ORDER BY 1, 2, 3, ..., n (n = column number of Tables)应用于结果.当您没有任何重复行时,您可以看到此副作用.
我加一个例子
UNION合并的速度明显较慢->,因为它需要比较(在Oracle SQL开发人员中,选择查询,按F10键以查看成本分析)。
UNION ALL,它合并时没有不同->更快。
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
Run Code Online (Sandbox Code Playgroud)
和
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1283481 次 |
| 最近记录: |