积极答复者
Count(*) 跟Count(1) 哪个效率高? 问题真的有那么简单吗?

问题
-
Select Count(*) from Table1
Select Count(1) from Table1
上面2个语句,有人告诉我,这个问题很简单拉,你看执行计划呀,真的有那么简单吗?
Count(1)会被转化为 Count(*) ,所以它们的效率一样高拉。没错,是这样的,但这不就说明了Count(*)的效率比 Count(1)高出了那么一点点嘛(因为 Count(1)会被转化为 Count(*) 也是需要的时间的)。
所以我们得出了Count(*)的效率比 Count(1)高出了那么一点点嘛结论。
但问题真的是这样的吗?
SQL SERVER 引擎执行Count(*)的时候 ,它遇到了*,那它会怎么处理*的语义呢,会不会有一个meta-data的查询呢? 如果有的话,那么它们哪个快拼的就是meta-data的查询跟Count(express) 里express的验证哪个快了。
所以它们到底哪个快呢?
您怎么认为呢?
- 已编辑 Jacky_shen 2012年5月12日 13:50
答案
-
我看到的所以的答案就是执行计划级别的,从这方面来看肯定是一样的,我在问题中就已经说明了,这也不是我需要的答案。
其实,我想知道的CPU周期级别的比较,在FORUM应该得不到答案了,我也觉得这样的比较只有那些熟悉source code的人才可能知道,先就这样吧。
- 已标记为答案 Jacky_shen 2012年5月19日 14:10
- 已编辑 Jacky_shen 2012年5月19日 14:10
全部回复
-
- 已建议为答案 Molly Chen_Moderator 2012年5月15日 10:21
- 取消建议作为答案 Jacky_shen 2012年5月17日 5:12
-
找到这篇既有的讨论,或许你可以参考看看。如果我没看错的话,COUNT(*)和COUNT(1)在大部分的情况下应该效能是一样的。
http://social.msdn.microsoft.com/Forums/en/transactsql/thread/c0770efb-cd1d-4073-8098-756d5a733398
以上說明若有錯誤請指教,謝謝。
http://www.dotblogs.com.tw/terrychuang/
-
我也觉得那种差别只有了解source code的developer才可能真正的清楚了。 当然他们的差别对实际的操作的影响应该很小,或许我的问题只是理论上的需求了。
- 已编辑 Jacky_shen 2012年5月13日 3:26
-
Count(*):一般保守做法。
Count(1):取代的Count(某字段名称)的,基本和Count(*)一致(统计某个字段的个数,包含null或者空白字符串)。
Count(某字段名称):不统计null的字段。
个人认为:Count(*)应该最快,Count(0)或者Count(1)次之(不过效果差不多)。
或许您设置一下主键、唯一索引什么的可以比较。
不过Count(主键)/Count(rowid)应该可能更快一些,直接统计非重复的主键索引了……
- 已编辑 ThankfulHeart 2012年5月13日 3:58
-
Count(*):一般保守做法。
Count(1):取代的Count(某字段名称)的,基本和Count(*)一致(统计某个字段的个数,包含null或者空白字符串)。
Count(某字段名称):不统计null的字段。
个人认为:Count(*)应该最快,Count(0)或者Count(1)次之(不过效果差不多)。
或许您设置一下主键、唯一索引什么的可以比较。
不过Count(主键)/Count(rowid)应该可能更快一些,直接统计非重复的主键索引了……
count(主键)无疑是最慢的,你应该懂得索引结构的。
Best Regards, nicofer
- 已编辑 nicofer 2012年5月13日 4:05
-
不会去查metadata,count(1)和count(*)的差别,最多也就是几个cpu时钟周期,所以追究哪个更快是没有意义的。
想不想时已是想,不如不想都不想。
谢谢。
对实际的应用确实不会有很大的区别,我只是在理论上想在cpu时钟周期级别比较一下,不过如果确实能省几个CPU时钟周期,那也好啊,对吧?
顺便问一下,你怎么知道不会去查metadata? 你是不是看到过source code?
- 已编辑 Jacky_shen 2012年5月14日 2:41
-
联机丛书里面有很清楚的表述。
COUNT(*) 返回指定表中行数而不删除副本。它对各行分别计数。包括包含空值的行。
想不想时已是想,不如不想都不想。
- 已编辑 怡红公子Moderator 2012年5月14日 5:47 typo
- 已建议为答案 Molly Chen_Moderator 2012年5月15日 10:22
- 取消建议作为答案 Jacky_shen 2012年5月17日 5:12
-
我当然知道count(1)和count(*)的效率差不多了,
我要的就是cpu时钟周期级别的比较,不然我也不会问这个问题了。
- 已编辑 Jacky_shen 2012年5月17日 5:12
-
-
我看到的所以的答案就是执行计划级别的,从这方面来看肯定是一样的,我在问题中就已经说明了,这也不是我需要的答案。
其实,我想知道的CPU周期级别的比较,在FORUM应该得不到答案了,我也觉得这样的比较只有那些熟悉source code的人才可能知道,先就这样吧。
- 已标记为答案 Jacky_shen 2012年5月19日 14:10
- 已编辑 Jacky_shen 2012年5月19日 14:10
-
怡红公子:
非常感谢上面的几次回复,不过我的回复好像跟态度没有什么关系吧?其实我在问问题之前就已经猜到很多会这样回答,所以我特定在问题中提了一下,好像很少有人明白我,除了你提到的“cpu时钟周期”之外:-)
顺便说一下,这不是作为DBA应有的态度,但我不是DBA,嘻嘻
桦仔:
“自己选自己为答案”是这样的,因为我看到如果帖子长时间没有标记答案的话,会被管理员标记答案的,但管理员标记的答案很可能不是我想要的那个,所以就自己标记自己答案了,以免发生这种情况。
- 已编辑 Jacky_shen 2012年6月8日 3:00
-