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 所有性能的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server-聚焦UNIOL ALL/UNION查询
SQL Server 是不是可以使用 PHP 从 UNION 查询中返回不同的别名列名?