前言
本节我们来看看有关查询中UNION和UNION ALL的问题,简短的内容,深入的理解,Always to review the basics。
初探UNION和UNION ALL
首先我们过一遍二者的基本概念和使用方法,UNION和UNION ALL是将两个表或者多个表进行JOIN,当然表的数据类型必须相同,对于UNION而言它会去除重复值,而UNION ALL则会返回所有数据,这就是二者的区别和使用方法。下面我们来看一个简单的例子。
USE TSQL2012
GO
--USE UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 2
UNION ALL
SELECT 3
--USE UNION
SELECT 1
UNION
SELECT 2
UNION
SELECT 2
UNION
SELECT 3
上述我们稍微讲解了下二者的基本使用,接下来我们来看看二者的性能比较。
进一步探讨UNION 和 UNION ALL性能问题
我们首先创建两个测试表Table1和Table2
USE TSQL2012
GO
CREATE TABLE Table1
(
col VARCHAR(10)
)
CREATE TABLE Table2
(
col VARCHAR(10)
)
在表Table1中插入如下测试数据
USE TSQL2012
GO
INSERT INTO Table1
SELECT 'First'
UNION ALL
SELECT 'Second'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fourth'
UNION ALL
SELECT 'Fifth'
在表Table2中插入如下测试数据
USE TSQL2012
GO
INSERT INTO Table2
SELECT 'First'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fifth'
我们查询下两个表插入的测试数据
USE TSQL2012
GO
SELECT *
FROM Table1
SELECT *
FROM Table2
接着分别利用UNION和UNION ALL来查询数据比较二者性能开销
USE TSQL2012
GO
--UNION ALL
SELECT *
FROM Table1
UNION ALL
SELECT *
FROM Table2
--UNION
SELECT *
FROM Table1
UNION
SELECT *
FROM Table2
此时我们能够很明显的看到因为UNION要去除重复所以会进行DISTINCT Sort操作使得其性能要低于UNION ALL。到这里我们可以下个基本结论。
UNION VS UNION ALL性能分析结论:当使用UNION查询语句时类似会进行SELECT DISTINCT操作,除非我们非常明确要返回唯一不重复的值那就用UNION,否则使用UNION ALL会带来更好的性能,返回结果集更快。
是不是到此就完了呢,使用UNION和UNION ALL就这么简单么,那你就太天真了,我们继续往下看。
深入探讨UNION 和 UNION ALL(一)
我们声明一个表变量插入数据并利用UNION ALL来进行查询
USE TSQL2012
GO
DECLARE @tempTable TABLE(col TEXT)
INSERT INTO @tempTable(col)
SELECT 'JeffckyWang'
SELECT col FROM @tempTable
UNION ALL
SELECT 'Test UNION ALL'
此时对应返回合并结果集,恩,没毛病,我们接下来看看UNION
USE TSQL2012
GO
DECLARE @tempTable TABLE(col TEXT)
INSERT INTO @tempTable(col)
SELECT 'JeffckyWang'
SELECT col FROM @tempTable
UNION
SELECT 'Test UNION ALL'
USE TSQL2012
GO
CREATE TABLE Table1 (ID INT, Col1 VARCHAR(100));
CREATE TABLE Table2 (ID INT, Col1 VARCHAR(100));
GO
INSERT INTO Table1 (ID, Col1)
SELECT 1, 'Col1-t1'
UNION ALL
SELECT 2, 'Col2-t1'
UNION ALL
SELECT 3, 'Col3-t1';
INSERT INTO Table2 (ID, Col1)
SELECT 3, 'Col1-t2'
UNION ALL
SELECT 2, 'Col2-t2'
UNION ALL
SELECT 1, 'Col3-t2';
GO
此时我们查询上述Table1和Table2数据如下:
USE TSQL2012
GO
SELECT ID, Col1, 'addtionalcol1' AS addtionalCol
FROM dbo.Table1
UNION ALL
SELECT ID, Col1, 'addtionalCol2' AS addtionalCol
FROM dbo.Table2
ORDER BY addtionalCol, ID
GO