作为我早期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 ,我想这让我对选择计数(*)持怀疑态度
答案 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
子句会更好。