Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 条件计数:使用SUM()与COUNT()的性能差异?_Sql_Count_Query Optimization - Fatal编程技术网

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