【问题标题】:Speed of MIN/MAX vs GROUP BY for aggregating constant-in-group values聚合组内常数值的 MIN/MAX 与 GROUP BY 的速度
【发布时间】:2017-01-30 15:21:47
【问题描述】:

在表T 中,保证A 列的每个值都与B 列的一个值相关联(即存在functional dependency A → B)。因此,下面的两个查询都返回相同的结果。哪个一般会跑得更快?

AB 上使用 GROUP BY

select
   A
   ,B
   ,sum(C) 
from
   T
group by
   A
   ,B

或者在B上使用MAX/MIN?

select
   A
   ,MAX(B)
   ,sum(C) 
from
   T
group by
   A

我知道 GROUP BY AB 版本更擅长不隐藏与多个 B 相关联的 A 到达的数据问题,我只是好奇是否有一个查询通常需要 DBMS 执行更多的工作。如果答案完全取决于 DBMS 的选择,并且您仍有有趣的信息要分享,那么请选择您最喜欢的 DBMS 并仅针对它进行回答。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 假设 MS SQL Server 2016...
  • 任何有 SQL Server 经验的人可能都知道不要猜测这样的东西,并在优化器中采用这两种选择来找出他们的服务包/CU 级别的答案/表大小/可用索引/碎片/处理器数量/查询标志/统计/月相(不一定按重要性顺序)。我非常笼统的回答将是一个非常无聊且缺乏想象力的“这取决于(但在大多数情况下可能不会有很大变化)”。
  • 我会选择后者,因为它更清楚(对未来的读者)A 将在结果中是独一无二的。会影响性能的是有一个合适的覆盖索引可用......以A和B作为前导列(按此顺序)并包括C列。我希望这两个查询的性能相似,但如果一个结果是更快,我的猜测是第二个。为了掌握性能,我将查看执行计划并测量两个语句的性能。 (性能主要取决于使用合适索引的计划。)

标签: sql sql-server performance


【解决方案1】:

好吧,我继续在 SQL Server 2016 上进行了测试,尽管我有兴趣发现更一般的、基于理论的信息。我在上面B 的角色中使用了四列来强调运行时间的任何差异,并提交了一个包含上述两种查询类型的批处理。 SQL Server 生成的执行计划几乎相同,但 GROUP BY 查询报告的成本是批次的 53%,而 MAX/MIN 查询的成本是 47%。

两个查询的初始索引查找步骤相同。接下来是哈希表构建步骤,其中 GROUP BY 版本比 MAX/MIN 版本产生更高的成本。之后的步骤对于两个版本的成本都可以忽略不计。

与直觉相反,尽管 GROUP BY 版本的成本略更高,但它的运行时间略更少。我想如果并行度更高,运行时仍然可能消耗更多的 CPU 周期。在这一点上,我已经达到了我的能力(和胃口)的尽头,无法搜索 DBMS 执行计划,所以我将把它留在那里。

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 2021-02-25
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多