SQL Server 查询:Union vs Distinct union 所有性能

Posted

技术标签:

【中文标题】SQL Server 查询:Union vs Distinct union 所有性能【英文标题】:SQL Server query: Union vs Distinct union all performance 【发布时间】:2016-01-29 19:59:45 【问题描述】:

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

【问题讨论】:

将两个查询放在一个会话中,激活执行计划并执行。比较实际执行计划中的百分比 那是我做的,但我当时只有几千条记录——不足以测试实际总执行时间的差异,更不用说调整行数、列数,列的数据类型等,以获得一般答案。正如我所说,我运行的执行计划看起来是一样的。即使不是这样,就总执行时间而言,一个下降另一个上升并不意味着任何事情。 【参考方案1】:

DISTINCT不一定是排序实现的,也可以是散列实现的。

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

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

【讨论】:

【参考方案2】:

我们暂时不要谈论 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,这完全取决于您在每个单独的表中拥有的数据大小,并且可能是其他一些因素。

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

【讨论】:

以上是关于SQL Server 查询:Union vs Distinct union 所有性能的主要内容,如果未能解决你的问题,请参考以下文章

使用多个 UNION 重写 SQL Server 查询

SQL SERVER 查询中的 UNION

SQL Server-聚焦UNIOL ALL/UNION查询

SQL Server 是不是可以使用 PHP 从 UNION 查询中返回不同的别名列名?

sql server 查询 order by 与 union 并替换多个列的空值

SQL Server:如何将 UNION 与两个都有 WHERE 子句的查询一起使用?