UNION与SELECT DISTINCT和UNION ALL Performance

Pra*_*mar 15 t-sql sql-server

这两种性能方面有什么区别吗?

-- eliminate duplicates using UNION
SELECT col1,col2,col3 FROM Table1 
UNION SELECT col1,col2,col3 FROM Table2 
UNION SELECT col1,col2,col3 FROM Table3 
UNION SELECT col1,col2,col3 FROM Table4 
UNION SELECT col1,col2,col3 FROM Table5       
UNION SELECT col1,col2,col3 FROM Table6       
UNION SELECT col1,col2,col3 FROM Table7       
UNION SELECT col1,col2,col3 FROM Table8       

-- eliminate duplicates using DISTINCT    
SELECT DISTINCT * FROM
(     
    SELECT col1,col2,col3 FROM Table1 
    UNION ALL SELECT col1,col2,col3 FROM Table2 
    UNION ALL SELECT col1,col2,col3 FROM Table3 
    UNION ALL SELECT col1,col2,col3 FROM Table4 
    UNION ALL SELECT col1,col2,col3 FROM Table5       
    UNION ALL SELECT col1,col2,col3 FROM Table6       
    UNION ALL SELECT col1,col2,col3 FROM Table7       
    UNION ALL SELECT col1,col2,col3 FROM Table8       
) x   
Run Code Online (Sandbox Code Playgroud)

San*_*kar 22

之间的区别联盟联盟所有UNION ALL不会消除重复行,而是刚刚从适合您查询具体的所有表中提取所有行并将它们组合成一个表.

一个UNION语句有效确实对结果集的SELECT DISTINCT.

如果从Union All结果集中选择Distinct,则输出将等于 Union结果集.

编辑:

CPU成本表现:

让我用例子解释一下:

我有两个问题.一个是Union,另一个是Union All

SET STATISTICS TIME ON
GO

select distinct * from (select * from dbo.user_LogTime
union all
select * from dbo.user_LogTime) X 
GO

SET STATISTICS TIME OFF

SET STATISTICS TIME ON
GO

select * from dbo.user_LogTime
union
select * from dbo.user_LogTime
GO

SET STATISTICS TIME OFF
Run Code Online (Sandbox Code Playgroud)

我确实在SMSS的同一查询窗口中运行了这两个.让我们看看SMSS中的执行计划:

执行计划

会发生什么情况,使用Union AllDistinct的查询将比使用Union的查询花费更多的CPU成本.

按时表现:

UNION ALL:

(1172 row(s) affected)

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 39 ms.
Run Code Online (Sandbox Code Playgroud)

联盟:

(1172 row(s) affected)

SQL Server Execution Times:
   CPU time = 10 ms,  elapsed time = 25 ms.
Run Code Online (Sandbox Code Playgroud)

因此,Union性能方面明显优于Union All