select count(*) 与 select count(1)区别?

来源:互联网 发布:汇通财经数据直播 编辑:程序博客网 时间:2024/05/16 19:55
 发表于 2008-5-8 15:35:49 |只看该作者
原帖由 yangfei080 于 2008-5-8 14:19 发表 
我知道:
select   count(*)是统计表中所有记录个数 
而select   count(1)是返回首行
后者的效率比前者要高

请问:
达人们能够解释下两者oracle内部实现的区别?
感谢!


楼主理解错了,select count(1) 可不是返回首列行数
其原理是对数字1进行统计,会将表中所有记录转化为1,然后再计数统计
相当于先select 1 from table 然后count
拼命赚钱买彩票!
 


 

原帖由 yangfei080 于 2008-5-8 16:38 发表
测试了一把,louis_xu 说的应该是对的

但是还是不太明白为什么 count(1) 要比 count(*)快呢?
按我的理解count(*)是直接统计记录行数,而count(1)要将每行记录转化为1再统计,应该是count(*)比count(1)快呀?




跟表结构有关系:
如果表中没有主键,那么count(1)比count(*)快
如果有主键,那么count(主键,联合主键)比count(*)快
如果表中只有一个字段,count(*)最快
以前看一位高手说的,不知道为什么

 

 

当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 

从执行计划来看,count(1)和count(*)的效果是一样的。 
但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。 
这个也与表的记录数多少有关!如果1w以外的数据量,做过表分析之后,反而count(1)的用时比 count(*)多了。 

另外,当数据量达到10w多的时候,使用count(1)要比使用count(*)的用时稍微少点! 

如果你的数据表没有主键,那么count(1)比count(*)快 
如果有主键的话,那主键(联合主键)作为count的条件也比 count(*)要快 
如果你的表只有一个字段的话那count(*)就是最快的啦 
count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。 
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 
因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的 
因此:count(1)和count(*)基本没有差别!