Sql 条件计数:使用SUM()与COUNT()的性能差异?
作为一个非常简单的示例,假设我有一个表Sql 条件计数:使用SUM()与COUNT()的性能差异?,sql,count,query-optimization,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 对于每个a,我要计算出
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
对于每个a
,我要计算出<50的b
。结果如下:
a | bcnt
--------------
1 | 4
2 | 2
3 | 0
现在,我可以通过以下两种方式之一实现此结果:
SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt
FROM test
GROUP BY a
选择a,计数(b<50时为1,否则为空结束)作为bcnt
从测试
分组
或:
选择a和(b<50时为1,否则为0结束)作为bcnt
从测试
分组
我知道这似乎是一件微不足道的小事,但我的问题是,在性能方面,使用一种方法比另一种方法有什么优势(无论多么微小)?。。。他们将在多少其他DBMS中工作?。。。声明的清晰性?。。。等等。使用COUNT,您可以对元素进行计数,使用和,您可以添加数字(正数、负数或零),结果可能是负数。where子句有什么问题:
select a, count(b)
from test
where b < 50
group by a
选择a,计数(b)
从测试
其中b<50
分组
就个人而言,我会使用
select a, count(b)
from test
where b < 50
group by a
选择a,计数(b)
从测试
其中b<50
分组
清晰、简洁,并且根据这一点比其他的要快一点(根据执行计划,需要的数据更少,尽管表格如此之小,您不会注意到差异):
表演
哦,如果有区别的话,我肯定差别不大。这对我来说没什么好担心的
他们将在多少其他DBMS中工作
我毫不怀疑这两种方法至少都适用于任何主要的SQL产品,因此,再次强调,这不是一个值得关注的问题,对我来说也不是
声明的清晰性
当然,COUNT
更清楚地表明,您希望计算事物,而不是将一些任意值相加。使用SUM
,您只有在浏览条件后到达THEN 1
部分,才能实现实际意图
另外,如果我使用COUNT
我可以省略ELSE NULL
部分,因为当ELSE
不存在时,这就是隐含的。如果在SUM
表达式中省略ELSE 0
,则可能会得到NULL
结果,而不是预期的0
另一方面,可能存在完全相反的情况,在这种情况下,作为计数的结果返回
NULL
而不是0
会更方便。因此,如果我使用COUNT
,我将不得不执行类似NULLIF(COUNT(CASE…),0)
,而使用SUM(CASE…
,只需省略ELSE
子句即可。但即使在这种情况下,我可能仍然更喜欢更清晰的内容,而不是更模糊的简短内容(其他条件相同)。“我想知道…”的数量。问就是回答?:-)嗯??用于聚合函数的筛选结果。你是说在哪里?
select a, count(b)
from test
where b < 50
group by a