在表格T
中,可以保证列A
的每个值都与列B
的一个值相关联(即有一个functional dependency A→B)。因此,下面的两个查询都会返回相同的结果。哪一个通常运行得更快?
在A
和B
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 A
和B
版本最好不要隐藏A
到达时与多个B
相关联的数据问题,我只是好奇其中一个查询是否通常更适合DBMS执行。如果答案完全取决于DBMS的选择,并且您仍然可以分享有趣的信息,那么请选择您喜欢的DBMS并仅回答它。
答案 0 :(得分:2)
我继续在SQL Server 2016上进行测试,尽管我有兴趣发现更一般的,基于理论的信息。我在上面B
的角色中使用了四列来强调运行时间的任何差异,并提交了一个包含上述两种查询类型的批处理。 SQL Server生成的执行计划几乎相同,但GROUP BY查询报告的成本是批处理的53%,而MAX / MIN查询的成本是47%。
两个查询的初始索引搜索步骤相同。接下来是哈希表构建步骤,其中GROUP BY版本的成本高于MAX / MIN版本。之后的步骤对两个版本的成本都可以忽略不计。
与直觉相反,尽管GROUP BY版本的成本略高于 ,但它的运行时间略短于 。但也许类似于CPU在这个较短的时间内负载不成比例地解释了为什么它被认为总成本更高。在这一点上,我已经达到了我的能力(和胃口)的结束,以便剔除DBMS执行计划,所以我将其留在那里。