SQL 服务器查询:Union vs Distinct union all performance

SQL Server query: Union vs Distinct union all performance

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等类似问题的区别在于,我可以提前确认我使用的个人table不会有任何重复记录他们之间,只在个人table之间。

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

暂时不谈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,这完全取决于每个人的数据大小table,也可能是其他一些因素。

我承认这不是一个完整的答案,仍然希望这对您有所帮助。

DISTINCT不一定要用sort来实现,也可以用hash来实现。

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

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