Count(*)为什么比Count(字段名)好

作者:leen 来源:ITPOW(原创) 日期:2005-12-30

我们在统计记录数时,常常推荐Count(*)而不推荐Count(字段名)(当然有特殊需要除外),这是因为Count(*)效率要高于Count(字段名),数据量越大表现越明显。

tbl表中:A是普通字段不可为NULL,B为普通字段可为NULL,id为主键,并在id上建聚集索引。
SET STATISTICS IO ON
select count(A) from tbl
select count(B) from tbl
select count(*) from tbl

F5执行,得到如下结果:

====================

(所影响的行数为 1 行)

表 'tbl'。扫描计数 1,逻辑读 244 次,物理读 0 次,预读 0 次。

(所影响的行数为 1 行)

警告: 聚合或其它 SET 操作消除了空值。
    表 'tbl'。扫描计数 1,逻辑读 2076 次,物理读 0 次,预读 0 次。

(所影响的行数为 1 行)

表 'tbl'。扫描计数 1,逻辑读 244 次,物理读 0 次,预读 0 次。
====================

可以看到在统计字段B时,逻辑读达2076次,而另外两次均只有244次。这是由于使用Count(字段),而此字段又可为NULL,所以在统计时要将NULL忽略,这就使得要对每一条记录进行确定,所以很耗IO,假如没有合适的索引,更会引起全表扫描,要知道在记录非常多时全表扫描是致使的错误。而字段A由于不可为NULL,优化程序会优化它,所以它的IO也非常小。注意Count(*)中即使有两条记录字段全为NULL,也要算作两条记录。

相关阅读

相关文章