SQL Server查询:Union vs Distinct union all performance

时间:2016-01-29 19:59:45

标签: sql sql-server performance database-performance sql-tuning

SQL在这两个语句之间的性能有差异吗?

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会更改为在distinct之前连接。我将一起连接大约20个表,并且不清楚做20个单独的DISTINCT是否比最后做一个大的DISTINCT更快,因为我仍然可以确认这些表不会在它们之间共享任何重复(仅在相同的内部)表)。

2 个答案:

答案 0 :(得分:2)

DISTINCT不一定按排序实现,也可以通过散列实现。

这两者都是内存消耗操作,减少被分散的数据的大小可以帮助减少所需的内存量,这有利于并发。

排序的算法复杂度为n log n,这意味着随着n的增长,所需的工作量会增加linearitmically。在此基础上,对10个较小的大小s进行排序通常应该比排序一个较大的大小10*s快。

答案 1 :(得分: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

它满足您提到的条件。类似地,列表一具有随机顺序的数字。但是现在您正在搜索唯一值,从 60 的列表中搜索,而不是更大的100个数字列表以及从中获得61的另一个列表。

来到SQL ,这一切都取决于每个表中的数据大小,可能还有其他一些因素。

我接受它并不是一个完整的答案,但仍希望这会有所帮助。