哪个更快:Sum(Case When)或Group By / Count(*)?

时间:2011-10-21 07:15:45

标签: sql count sum

我可以写

Select 
Sum(Case When Resposta.Tecla = 1 Then 1 Else 0 End) Valor1,
Sum(Case When Resposta.Tecla = 2 Then 1 Else 0 End) Valor2,
Sum(Case When Resposta.Tecla = 3 Then 1 Else 0 End) Valor3,
Sum(Case When Resposta.Tecla = 4 Then 1 Else 0 End) Valor4,
Sum(Case When Resposta.Tecla = 5 Then 1 Else 0 End) Valor5
From Resposta

或者

Select 
    Count(*)
From Resposta Group By Tecla

我在大量的行上尝试了这个,看起来好像花了相同的时间。

任何人都可以证实这一点吗?

5 个答案:

答案 0 :(得分:3)

DB在内部使用第二个查询执行的操作几乎与您明确指示第一个查询执行的操作相同。执行计划应该没有区别,因此在查询时间内也应该没有区别。考虑到这一点,明确使用第二个查询更好:

  • 当你有更多Tecla的值时,它会更加灵活 不需要更改您的查询
  • 更容易理解。如果Tecla有很多值 阅读第一个查询并意识到它只是很重要 不同的价值观
  • 它更小 - 您向数据库服务器发送更少的信息,它可能会更快地解析查询,这是我在此查询中看到的唯一性能差异。这有所不同,虽然很小

答案 1 :(得分:3)

我相信Group By更好,因为没有特定的治疗方法。 它可以通过数据库引擎进行优化。 我认为结果可能取决于您使用的数据库引擎。 也许你正在使用的那个优化了第一个查询,理解它就像一个小组!

您可以尝试“解释/解释计划”命令来查看引擎如何计算您的查询但是使用我的Microsoft SQL Server 2008,我只能看到两个操作之间的交换(“计算标量”和“agregate”)

我在数据库表上尝试过这样的查询:

  • SQL Server 2k8
  • 表中的163000行
  • 12个导管(Valor1→Valor12)

结果非常不同:

  • 分组依据:2秒
  • 案例时间:6秒!

所以我的选择是“分组依据”。 另一个好处是查询更容易编写!

答案 2 :(得分:2)

任何一个都必须从Resposta读取所有行,因此对于任何合理大小的表,我都希望I / O成本占主导地位 - 给出大致相同的整体运行时间。

我通常会使用:

Select
    Tecla,
    Count(*)
From Resposta
Group By Tecla

如果Tecla值的范围有可能在将来发生变化。

答案 3 :(得分:2)

我认为GROUP BY语句总是比SUM(CASE WHEN ...)更快,因为在SUM ...的示例中,使用GROUP BY时会有5种不同的计算,数据库只会简单排序和计算。

想象一下,你有一个装有不同硬币的袋子,你需要知道,你有多少硬币类型的硬币。你可以这样做:

  • SUM(CASE WHEN ...)方式是将每个硬币与预定义的样本硬币进行比较,并对每个样本进行数学运算(加1或0);
  • GROUP BY方式是按类型对硬币进行排序,然后计算earch组。

您更喜欢哪种方法?

答案 4 :(得分:0)

要公平地与count(*)竞争,您的第一个SQL应该是:

Select 
Sum(Case When Resposta.Tecla >= 1 AND Resposta.Tecla <=5 Then 1 Else 0 End) Valor
From Resposta

为了回答你的问题,我没有注意到SUM CASE WHENCOUNT之间的速度差异。我在POSTGRESQL中查询超过250,000行。