选择Count(*)vs Select Count(id)vs select count(1)。这些确实相同吗?

时间:2016-06-05 08:41:43

标签: sql-server select count

作为我早期question的后续行动:

一些答案​​和评论表明

select count(*)大致相当于select count(id),其中 id是主键。“

我一直赞成select count(1);我甚至总是使用if exists (select 1 from table_name) ...

现在我的问题是:

1)在桌子上发出select count query的最佳方式是什么?

2)如果我们添加 where 子句:where msg_type = X;如果msg_type非聚集索引select count(msg_type) from table_name where msg_type = X会成为计算的首选选项吗?

侧面栏:

从很小的时候开始,我被教导select * from... BAD BAD BAD ,我想这让我对选择计数(*)持怀疑态度

2 个答案:

答案 0 :(得分:6)

count(*)  --counts all values including nulls

count(id)-- counts this column value by excluding nulls

count(1) is same as count(*)
  

如果我们添加一个where子句:where msg_type = X;如果msg_type有一个non_clustered索引,会从table_name中选择count(msg_type),其中msg_type = X是计数的首选选项吗?

正如我在previous answer中提到的,SQL服务器是基于成本的优化器,选择的计划取决于许多因素.sql尝试在最短的时间内检索最便宜的计划..

现在当您发出count(msg_type)时,SQL 可以选择这个索引,如果这个更便宜或扫描另一个,只要它给出right结果(输出中没有空值) )..

我总是倾向于使用count(*),除非我想为reasons quoted here

排除空值

答案 1 :(得分:2)

嗯,那些计数查询不一样,会做不同的事情。

select count(1)
select count(*)

相同,并且会计算每条记录!

select count(col_name)

仅计算NOT NULL上的col_name值!

因此,除非col_name是您所说的PK,否则这些查询会做不同的事情。

关于你的第二个问题,这取决于,我们不能为你提供永远是真实的通用答案。您将不得不查看解释计划或只是检查自己,虽然我相信在使用此索引时添加此WHERE子句会更好。