mssql sqlserver sum(1)、count(*) 效率对比分析


摘要:
在sql脚本中,我们都熟知sum(1)同count(*)拥有通常的功能,都是统计符合条件的行数,下文通过举例的方式分析两种写法的效率


写在前面的话:
count(1) count(6) 具有同样的效率
count(*) 比count(1) count(6)效率低下一点点,因为会涉及null值列的剔除操作,会消耗cpu

   --count sum 效率对比(IO分析 CPU运行分析)
   SET STATISTICS IO ON 
SET STATISTICS TIME ON 
DBCC DROPCLEANBUFFERS ---清理缓存

select count(1) from [表名] 
go

print '------------------------'

SET STATISTICS IO ON 
SET STATISTICS TIME ON 
DBCC DROPCLEANBUFFERS ---清理缓存

select count(*) from [表名]  
go


print '------------------------'

SET STATISTICS IO ON 
SET STATISTICS TIME ON 
DBCC DROPCLEANBUFFERS ---清理缓存

select sum(1) from [表名]  
go
  

—————-输出—————-

SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

SQL Server 执行时间:
CPU 时间 = 62 毫秒,占用时间 = 65 毫秒。

(1 行受影响)
表 ‘表名******’。扫描计数 1,逻辑读取 13420 次,物理读取 147 次,预读 13416 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 375 毫秒,占用时间 = 1116 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 10 毫秒。
————————

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

SQL Server 执行时间:
CPU 时间 = 62 毫秒,占用时间 = 63 毫秒。

(1 行受影响)
表 ‘表名******’。扫描计数 1,逻辑读取 13420 次,物理读取 152 次,预读 13416 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 359 毫秒,占用时间 = 1116 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 1 毫秒,占用时间 = 1 毫秒。
————————

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

SQL Server 执行时间:
CPU 时间 = 62 毫秒,占用时间 = 62 毫秒。

(1 行受影响)
表 ‘表名******’。扫描计数 1,逻辑读取 13420 次,物理读取 127 次,预读 13416 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 484 毫秒,占用时间 = 1673 毫秒。


从以上的效率输出信息,我们可以看出
count(1) > count(*) > sum(1)
count(1)效率最高
count(*)其次
sum(1)效率最低
三种写法所涉及的逻辑读都一致
在CPU执行耗时上 sum(1)耗时最长:
因为sum:每遇见一行,则需执行一次 加上指定值得操作
而count:每遇见一行,只需自增加一次
两者在sql引擎中所使用的算法不同,
所以,当我们遇见统计行数时,需采用count对数据行进行统计。