MSSQL 常用行数统计行数count(*) count(1) count(列) 区别


一、count(*) count(1) count([列名]) 功能简介

实验环境:mssql server 2008
count(*) count(1) count([列名]):三个函数都是统计表行数的聚合函数。
count(1),count(*) 具有相同的功能,都是统计表中数据行数,无论行中的数据是否为null,都需要参与记数
count([列名]):统计[列名]中value不为null的值的行数


二、count(*) count(1) count([列名]) 举例说明

 /*1 建表并插入1万条数据*/
create table A(keyId int ,info varchar(100))
go

 

declare @i int 
set @i=1
while @i<100000
begin 
insert into A(keyId,info)values(@i,CONVERT(varchar(50),@i)+'testInfo')
set @i=@i+1
end 
insert into A values(null, null)
go
--------------------
*2 运行 count(1) count(*) count(列名) 查看逻辑读 返回值*/
 DBCC FREEPROCCACHE; DBCC DROPCLEANBUFFERS; SET STATISTICS io ON ;
 select COUNT(1) from A;
 SET STATISTICS io Off  ; 
go
DBCC FREEPROCCACHE; DBCC DROPCLEANBUFFERS; SET STATISTICS io ON ;
select COUNT(*) from A;
SET STATISTICS io Off ; 
go
DBCC FREEPROCCACHE; DBCC DROPCLEANBUFFERS;SET STATISTICS io ON ;
select COUNT(keyId) from A;;
SET STATISTICS io Off;   
go



可以看出 count(1) count(*) count(列名)具有相同的效率

3 在表A列keyId上新建索引 create index ix_A on A(keyId)

再次运行count(1) count(*) count(列名) 我们发现逻辑读降低了,效率得到了提升,而且三种查询方式都利用了索引进行统计。
综上所述:

count(*) count(1) count(列)之间的区别为
count([列名]):统计[列名]中value不为null的值的行数
count(1) count(*) 会统计所有行数
并且三种统计方式的运行效率无差异