【问题标题】:When the performance of Distinct and Group By are different?当 Distinct 和 Group By 的表现不同时?
【发布时间】:2012-05-25 21:57:55
【问题描述】:

我知道在简单查询中 Distinct 和 Group By 的性能和执行计划几乎相同。

例如

SELECT Name FROM NamesTable GROUP BY Name
SELECT DISTINCT Name FROM NamesTable

但我读过在某些情况下它们的性能会有所不同,例如在子查询等中?

那么,您能否举一些例子或解释一些表现不同的场景?

非常感谢

【问题讨论】:

  • 当他们做同样的事情时,他们的表现是一样的。当他们做不同的事情时,他们的表现可能会有所不同。如果有您感兴趣的具体示例,您应该将它们包含在您的问题中。
  • 为什么投反对票?这是一个可以回答的与编程相关的问题(尽管答案是“不,我们不能”)。

标签: sql-server tsql group-by distinct


【解决方案1】:

如果您在字段列表中包含计算值,您将看到执行计划中的差异。

select Value,
       getdate()
from YourTable
group by UnitID

select distinct
       Value,
       getdate()
from YourTable

group by 查询在计算标量值之前进行聚合。 distinct 查询在聚合之前计算标量值。

【讨论】:

  • 因此,这可能会产生不同的结果和/或性能。
  • @William - 结果不同。我见过的最明显的性能问题是当您使用for xml 技巧进行字符串连接时。我见过使用distinct 的版本和使用group by 的版本,group by 版本要快得多。但是,即使是这个简单的查询在执行超过 500000 行生成 40 个组时也会显示出性能差异。对我来说,group by 需要 80 毫秒,distinct 需要 105 毫秒。
  • 不,它肯定会产生不同的结果。例如,假设您有一个计算列,例如 ROW_NUMBER() 或一个返回值的用户定义函数。在这种情况下,对于 Distinct,首先为表中的每一行执行计算列,然后添加标量列,而在使用 Group By 时,首先将标量列分组,然后为每个组计算计算列。因此它们可以产生不同的结果,因为 Distinct 和 Group By 以不同的顺序执行计算的列。
  • @William 是的,你是对的。将上述查询中的getdate() 替换为newid() 会得到不同的结果。
【解决方案2】:

这里有 2 个示例,一个用于产生不同的结果,另一个用于不同的性能:

第二个例子:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多