【问题标题】:Which is faster: Sum(Case When) Or Group By/Count(*)?哪个更快:Sum(Case When) 或 Group By/Count(*)?
【发布时间】:2011-10-21 07:15:45
【问题描述】:

我会写

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

我在大量的行上尝试了这个,它似乎需要同样的时间。

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

【问题讨论】:

    标签: sql count sum


    【解决方案1】:

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

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

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

    • SQL Server 2k8
    • 表格中有163000行
    • 12 个类别(Valor1 -> Valor12)

    结果完全不同:

    • 分组方式:2 秒
    • 案例时间:6 秒!

    所以我的选择是“分组依据”。 另一个好处是查询更简单!

    【讨论】:

      【解决方案2】:

      数据库在内部对第二个查询所做的实际上与您明确告诉它对第一个查询所做的相同。执行计划和查询时间应该没有区别。考虑到这一点,显然使用第二个查询更好:

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

      【讨论】:

        【解决方案3】:

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

        我通常会使用:

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

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

        【讨论】:

          【解决方案4】:

          在我看来,GROUP BY 语句总是比 SUM(CASE WHEN ...) 快,因为在您的 SUM ... 示例中,将有 5 种不同的计算,而当使用 GROUP BY 时,DB 将简单地排序和计算。

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

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

          您更喜欢哪种方法?

          【讨论】:

            【解决方案5】:

            为了公平地与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 行。

            【讨论】:

              猜你喜欢
              • 2021-12-22
              • 2021-03-15
              • 2015-07-21
              • 2012-12-24
              • 1970-01-01
              • 2021-02-09
              • 1970-01-01
              • 2017-06-09
              • 1970-01-01
              相关资源
              最近更新 更多