条件计数:使用SUM()和COUNT()的性能差异?

Zan*_*ien 5 sql count query-optimization

就像一个非常简单的例子一样,假设我有一个test包含样本数据的表,如下所示:

a     |     b      
-------------
1     |    18
1     |    24
1     |    64
1     |    82
1     |    10
1     |     7
2     |     5
2     |    18
2     |    66
2     |    72
3     |    81
3     |    97
Run Code Online (Sandbox Code Playgroud)

对于每一个a,我要计算有多少b是<50的结果.结果看起来像:

a     |   bcnt
--------------
1     |      4
2     |      2
3     |      0
Run Code Online (Sandbox Code Playgroud)

现在我可以用两种方式之一来实现这个结果:

SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt
FROM test
GROUP BY a
Run Code Online (Sandbox Code Playgroud)

要么:

SELECT a, SUM(CASE WHEN b < 50 THEN 1 ELSE 0 END) AS bcnt
FROM test
GROUP BY a
Run Code Online (Sandbox Code Playgroud)

我知道这可能看起来像是一个微不足道的小问题,但我的问题是,在使用一种方法而不是另一种方法方面会有任何优势(无论多么轻微):性能?......他们将使用多少个其他DBMS ?......陈述的清晰度......等等

And*_*y M 7

性能?

哦,差别,如果有的话,将是微不足道的,我敢肯定.对我来说没什么可担心的.

他们将使用多少个其他DBMS?

我毫不怀疑它们至少可以在任何主要的 SQL产品中使用,所以,这也不是一个值得关注的问题,不管怎样对我来说都不是.

陈述的清晰度?

当然COUNT更清楚地表明你想要计算的东西,而不是添加一些任意值.有了SUM,你只有在THEN 1浏览完这个条件后到达这个部分才会意识到它的实际意图.

此外,如果我使用COUNT我可以省略该ELSE NULL部分,因为这ELSE是缺席时隐含的内容.如果我ELSE 0SUM表达式中省略,我可能会得到一个NULL结果而不是可能的结果0.

另一方面,可能存在相反的情况,即返回NULL而不是0计数的结果更方便.所以,如果我使用COUNT,我将不得不做一些类似的事情NULLIF(COUNT(CASE ...), 0),而SUM(CASE ...)这样就足以省略该ELSE条款.但即使在这种情况下,我仍然可能更喜欢稍微更清晰一点的简洁(其他条件相同).