读书人

SQL念叨:count(1)和count(*)

发布时间: 2012-12-15 15:16:03 作者: rapoo

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
[其他解释]
引用:

大哥,怎么where不一样呢?我表示的不清楚还是你不忍心仔细看我写的sql


是我不忍心问你小学语文老师的近况。

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

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

你觉得数据库少count(1)快,对吗?

再改个where条件条数多点,你觉得count(*)快起来了,对吗?

然后你就觉得select count(1) from tt 这个东西加大点数据量,count(*)应该更快,这不是你说的吗?

这个东西没where条件,和你前面有什么关系?
要比较你比较的也得是select count(1) from tt where change_date>='1900-01-01' and change_date<='3999-01-01'


[其他解释]
楼主,这种误差估计都是在任何语句执行范围内的

同样一句sql,执行n次,彼此之间时间的误差范围内。

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

是我不忍心问你小学语文老师的近况。

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

select
……

大哥 , 你看哈哈,我只是针对数据说话,没有说任何的快慢之说
[其他解释]
引用:
引用:大哥,怎么where不一样呢?我表示的不清楚还是你不忍心仔细看我写的sql

是我不忍心问你小学语文老师的近况。

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

select
……
我也没有发表我的任何结论。。。
[其他解释]


引用:
我也没有发表我的任何结论。。。

MB,中邪了。。。。


嗯,就是说你也认为这样结果很正常,是你中邪了,不是数据库中邪了,对吧。

那是我没看仔细。
[其他解释]
select(1)快些吧,我是用select(1),因为项目中都是这样写,随着大家吧,要不select(*)没水平
[其他解释]
对于大多数商业数据来说
在有主键或者带有索引时,count(*)更快一些
这些数据库中,count(1)是不使用索引的,而count(*)会自动扫描列索引(主键或索引)

某些文件数据库或者小型数据库可能没有这个优化策略
[其他解释]
引用:
以前总听别人说不要用count(*)的说

这都哪年的老古董和你说的了...
[其他解释]
以前总听别人说不要用count(*)的说
[其他解释]
学习不能盲目,凡是都需要以辩证唯物主义的思想去做。
支持楼主这种对问题深入测试并与大家共享测试结果的良好心态和做法。
鄙视道听途说就深信不疑,更有甚者还张扬卖弄的人。
以上仅代表个人看法。
ps:我平时也都是count(*),因为我发现在我的数据库中不论是*还是1还是字段,查询计划都相同...

读书人网 >J2EE开发

热点推荐