日期:2014-05-17  浏览次数:20575 次

Count(*) Count(1)

select count(*) from 表T
select  count(1) from 表T

 
听说这两者有区别,但是我测试了下,好像找不出啥毛病

求大神看看


------解决方案--------------------
一样的,都是求总数
------解决方案--------------------
在多表内联的时候没有差异,但是由于*号需要检查列的权限、也影响执行计划从而影响速度,所以一般没必要就不要用了。
在多表外联的时候,由于可能存在null值,而刚好count的时候又需要这个列,所以上面两个方式都不一定能得到准确数据,而需要count(列名)
------解决方案--------------------
单表查询是一样的,COUNT(1)或者COUNT其他值,意思就是统计“行数”,它并不真正代表一直数字,而是代表true
------解决方案--------------------
引用:
Quote: 引用:

在多表内联的时候没有差异,但是由于*号需要检查列的权限、也影响执行计划从而影响速度,所以一般没必要就不要用了。
在多表外联的时候,由于可能存在null值,而刚好count的时候又需要这个列,所以上面两个方式都不一定能得到准确数据,而需要count(列名)

上面2个SQL语句查询出来的条数是一样的,这科学不?
跟数据有关吧   换些数据有可能不一样吧
------解决方案--------------------
这种贴子经常看到,我现在给你一个结论吧,希望以后不会再看到这样的贴子,
count(*) 跟count(1)的性能几乎一模一样,原因就是count(1)会转化成count(*)。

如果你非要纠结哪个更好一点,那我告诉你,count(*)比count(1)的性能更好一点,你会这是谁说的,这是SQL SERVER QO 团队的里的 principal architect 说的。
我猜这是因为那个转化也是需要几个CPU cycle的吧。
------解决方案--------------------
如果是统计全表记录笔数的话,这样写比较快喔,

select rowcnt
 from sysindexes
 where id=object_id('表T')
 and indid<=1

------解决方案--------------------
至于count(*)跟count(1)的性能比较,个人认为是一样的,
SQL引擎会做内部的优化和等价处理的.
------解决方案--------------------
单表是一样的,多表特别是外联的时候就有可能不一样,你自己测试一下就的咯