2016-01-29 107 views
2

SQL在这两个语句之间的性能有差异吗?SQL Server查询:Union vs Distinct union所有性能

SELECT distinct 'A' as TableName, Col1, Col2, Col3 FROM A 
UNION ALL 
SELECT distinct 'B' as TableName, Col1, Col2, Col3 from B 

SELECT 'A' as TableName, Col1, Col2, Col3 FROM A 
UNION 
SELECT 'B' as TableName, Col1, Col2, Col3 from B 

这一点,类似的问题,如UNION vs DISTINCT in performance的是,我可以确认的时间提前了单独的表我使用不会有任何之间的重复记录之间的区别他们,只在个别表内。

执行计划对我来说看起来是一样的,因为它在连接之前对各个表进行排序。但是,如果我从它们中移除标量,则UNION ALL的计划基本保持不变,但UNION在变体之前更改为并置。我会将大约20个表连接在一起,并且不清楚是否执行20个单独的DISTINCT比最后执行一个大的DISTINCT快,因为我仍然可以确认这些表不会共享它们之间的任何重复(仅在相同表)。

+0

将两个查询放在一个会话中,激活执行计划并执行。比较实际执行计划中的百分比 – DimaSUN

+0

这是我所做的,但我当时只有几千条记录 - 不足以测试实际总执行时间的差异,更不用说调整行数,列数,列的数据类型等,以获得一般答案。正如我所说,我执行的执行计划看起来是一样的。即使不是,一个下降,另一个上升并不意味着总执行时间。 – WakeflyCBass

回答

2

DISTINCT不一定按排序实现,也可以通过哈希来实现。

这两个都是耗费内存的操作,减少数据大小以减少需要的内存量,这对于并发性是有利的。

排序的算法复杂度为n log n,这意味着所需工作随着n的增长而增长linearitmically。在此基础上,排序10个较小的尺寸集合s通常应该快于排序一个更大的尺寸集合10*s

0

让我们不要谈论SQL一分钟。

案例1:说,有一个100个数字的列表。

List: 1,2,3,4,....60 and then 61 repeats 40 times. 

该列表不安排,你不知道这一点在手。现在您正试图从100个号码的列表中搜索唯一值,然后对它们进行排序。

案例2:正如您所说,有两个列表中没有重复记录。

List 1: 1,2,3,4,....60 
List 2: 61,61,61,61... 40 times 

它满足您提到的条件。同样,列出一个数字的顺序是随机的。但是,现在您正在搜索的独特价值,从,而不是更大的一组100号,并从那里你会得到61

来到SQL另一个列表列表中,这一切都取决于规模你在每个表格中的数据,可能还有其他一些因素。

我接受它不是一个完整的答案,仍然希望这有助于。