日期:2014-05-19  浏览次数:20723 次

SQL谈论:count(1)和count(*)
本帖最后由 xj90314 于 2012-11-28 09:53:46 编辑 大家在编程的时候或多或少会遇到统计总数的sql,那么。count这个函数大家也是经常用到了。
之前记得看过一片帖子说,count(1)会比count(*)快,理由很简单。我只对第一列进行统计。话说理论上应该是对的。可是实际中并不然。
下面我举个例子、我自己的写的sql.为了数据的保密,我把表名更换了,大家见谅。
select 
--* 
count(1)
from tt where change_date>='2012-05-28' and change_date<='2012-08-28'

数据量:28753
结果是:1 row selected in 0.26 secs.

第二个SQL
select 
--* 
count(*)
from tt where change_date>='2012-05-28' and change_date<='2012-08-28'

数据量:28753
结果是:1 row selected in 0.25 secs.
count(*)比count(1)快了0.01secs。
 

好,我在加大数据量试试。时间调至前一年。
sql:
select 
--* 
count(*)
from tt where change_date>='2011-05-28' and change_date<='2012-08-28'

数据量:82805
时间结果:1 row selected in 0.31 secs.

sql:
select 
--* 
count(1)
from tt where change_date>='2011-05-28' and change_date<='2012-08-28'

数据量:82805
时间:1 row selected in 0.26 secs.

看来数据量大的时候count(1)性能会好点,好,继续加大数据量
SQL:
select 
--* 
count(1)
from tt 

结果是:243511
时间:1 row selected in 2.20 secs.

select 
--* 
count(*)
from tt

结果是:243511
时间:1 row selected in 0.12 secs.

MB,中邪了。。。。本人测试的环境为:VM4xp db2 
欢迎大家指三道四。
------最佳解决方案--------------------
1、话说这个帖子应该去数据库版块发;
2、不同数据库 及 不同版本效果不同;
3、其实很多知识都是在不断更新的,现在绝大部分数据库都已经对count(*)进行过优化了,所以除非是古董级的,否则基本都是直接count(*)。
------其他解决方案--------------------
就像Mice说的、count(*)已经被优化了!
count(*)的时候、如果表上有PK、那就走PK、没有PK就找not null索引!
count(1)如果你1的这个字段有索引则走索引、PK就走PK、如果不是、那就不能提速了!
------其他解决方案--------------------
count(*)
count(1)
count(字段)
应该有这三种,意思上面已经说的很明白了,我就不多说了
------其他解决方案--------------------
确实很快···
------其他解决方案--------------------
理论上来说,count(*)统计查询结果多列的行数和单列的行数,结果是一样的,它必然在实现上会选择简单的方式。
------其他解决方案--------------------
引用:
1、话说这个帖子应该去数据库版块发;
2、不同数据库 及 不同版本效果不同;
3、其实很多知识都是在不断更新的,现在绝大部分数据库都已经对count(*)进行过优化了,所以除非是古董级的,否则基本都是直接count(*)。
你沙发占的真快。。
------其他解决方案--------------------
引用:
你沙发占的真快。。


今天刚打开CSDN,看到第一个帖子就是你的。。。
------其他解决方案--------------------
不发执行计划发个时间有什么用。

连where条件都不一样的SQL你觉得你改变的只是数据量?

直接写count(*)如果走的是索引,根本就不走表。
------其他解决方案--------------------
引用:
不发执行计划发个时间有什么用。

连where条件都不一样的SQL你觉得你改变的只是数据量?

直接写count(*)如果走的是索引,根本就不走表。

大哥,怎么where不一样呢?我表示的不清楚还是你不忍心仔细看我写的sql
------其他解决方案--------------------
引用: