【发布时间】:2017-01-30 15:21:47
【问题描述】:
在表T 中,保证A 列的每个值都与B 列的一个值相关联(即存在functional dependency A → B)。因此,下面的两个查询都返回相同的结果。哪个一般会跑得更快?
在 A 和 B 上使用 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 A 和 B 版本更擅长不隐藏与多个 B 相关联的 A 到达的数据问题,我只是好奇是否有一个查询通常需要 DBMS 执行更多的工作。如果答案完全取决于 DBMS 的选择,并且您仍有有趣的信息要分享,那么请选择您最喜欢的 DBMS 并仅针对它进行回答。
【问题讨论】:
-
您使用的是哪个 DBMS?后格雷斯?甲骨文?
-
假设 MS SQL Server 2016...
-
任何有 SQL Server 经验的人可能都知道不要猜测这样的东西,并在优化器中采用这两种选择来找出他们的服务包/CU 级别的答案/表大小/可用索引/碎片/处理器数量/查询标志/统计/月相(不一定按重要性顺序)。我非常笼统的回答将是一个非常无聊且缺乏想象力的“这取决于(但在大多数情况下可能不会有很大变化)”。
-
我会选择后者,因为它更清楚(对未来的读者)
A将在结果中是独一无二的。会影响性能的是有一个合适的覆盖索引可用......以A和B作为前导列(按此顺序)并包括C列。我希望这两个查询的性能相似,但如果一个结果是更快,我的猜测是第二个。为了掌握性能,我将查看执行计划并测量两个语句的性能。 (性能主要取决于使用合适索引的计划。)
标签: sql sql-server performance