MIN/MAX 与 GROUP BY 聚合组内常量值的速度

Dza*_*ton 9 sql sql-server performance

在表 中T,保证列的每个值都A与列的一个值相关联B(即存在函数依赖性A \xe2\x86\x92 B)。因此,下面的两个查询都会返回相同的结果。一般来说,哪一个跑得更快?

\n\n

A在和上使用 GROUP BYB

\n\n
select\n   A\n   ,B\n   ,sum(C) \nfrom\n   T\ngroup by\n   A\n   ,B\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者使用 MAX/MIN B

\n\n
select\n   A\n   ,MAX(B)\n   ,sum(C) \nfrom\n   T\ngroup by\n   A\n
Run Code Online (Sandbox Code Playgroud)\n\n

我确实知道 GROUP BYABversion 更擅长不隐藏与A多个 相关联的数据问题B,我只是好奇其中一个查询通常是否需要 DBMS 执行更多工作。如果答案完全取决于 DBMS 的选择,并且您仍然有有趣的信息可以分享,那么选择您最喜欢的 DBMS 并仅回答它。

\n

Dza*_*ton 11

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

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

与直觉相反,尽管 GROUP BY 版本的成本稍高但它的运行时间略。我想如果并行度更大的话,运行时仍然可能消耗更多的 CPU 周期。此时,我已经无法(和兴趣)探查 DBMS 执行计划,所以我将其留在那里。