none
Count(*) 跟Count(1) 哪个效率高? 问题真的有那么简单吗? RRS feed

  • 问题

  • 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的验证哪个快了。

    所以它们到底哪个快呢?

    您怎么认为呢?




    2012年5月12日 13:20

答案

  • 我看到的所以的答案就是执行计划级别的,从这方面来看肯定是一样的,我在问题中就已经说明了,这也不是我需要的答案。

    其实,我想知道的CPU周期级别的比较,在FORUM应该得不到答案了,我也觉得这样的比较只有那些熟悉source code的人才可能知道,先就这样吧。


    2012年5月19日 14:10

全部回复

  • 效率一样高,查看执行计划 会选择表内最小索引

    Roy Wu(吳熹Blog)(微博)

    2012年5月12日 14:25
    版主
  • 效率一样高,查看执行计划 会选择表内最小索引

    Roy Wu(吳熹Blog)(微博)

    谢谢,不过你没有看清楚我的问题。

    是的,我知道他们的执行计划是一样的。

    2012年5月12日 14:29
  • 找到这篇既有的讨论,或许你可以参考看看。如果我没看错的话,COUNT(*)和COUNT(1)在大部分的情况下应该效能是一样的。

    http://social.msdn.microsoft.com/Forums/en/transactsql/thread/c0770efb-cd1d-4073-8098-756d5a733398


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月12日 15:22
  • Hi jacky, 为什么“Count(1)会被转化为   Count(*) ”? 为什么不认为他们都是在取表总行数,而进行一个同样的操作呢?也没有count(*)转成count(number)或count(number)转成count(*) ?
    我觉得没有真正意义上的差别,如果有,也应该可以忽略,要想找到真正你要的答案,我想只有写SQL Server代码的那些人知道了。通常我们就以IO和Execute Plan为基准了,不是吗?

    Best Regards, nicofer




    • 已编辑 nicofer 2012年5月13日 1:20
    2012年5月13日 1:18
  • 我也觉得那种差别只有了解source code的developer才可能真正的清楚了。 当然他们的差别对实际的操作的影响应该很小,或许我的问题只是理论上的需求了。



    2012年5月13日 2:25
  • Count(*):一般保守做法。

    Count(1):取代的Count(某字段名称)的,基本和Count(*)一致(统计某个字段的个数,包含null或者空白字符串)。

    Count(某字段名称):不统计null的字段。

    个人认为:Count(*)应该最快,Count(0)或者Count(1)次之(不过效果差不多)。

    或许您设置一下主键、唯一索引什么的可以比较。

    不过Count(主键)/Count(rowid)应该可能更快一些,直接统计非重复的主键索引了……


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月13日 3:44
  • Count(*):一般保守做法。

    Count(1):取代的Count(某字段名称)的,基本和Count(*)一致(统计某个字段的个数,包含null或者空白字符串)。

    Count(某字段名称):不统计null的字段。

    个人认为:Count(*)应该最快,Count(0)或者Count(1)次之(不过效果差不多)。

    或许您设置一下主键、唯一索引什么的可以比较。

    不过Count(主键)/Count(rowid)应该可能更快一些,直接统计非重复的主键索引了……


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    count(主键)无疑是最慢的,你应该懂得索引结构的。


    Best Regards, nicofer


    • 已编辑 nicofer 2012年5月13日 4:05
    2012年5月13日 4:04
  • sorry,count(主键)是最慢的,应该说count(rowid)相对可能比较快。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月13日 5:18
  • 不会去查metadata,count(1)和count(*)的差别,最多也就是几个cpu时钟周期,所以追究哪个更快是没有意义的。

    想不想时已是想,不如不想都不想。

    2012年5月13日 14:40
    版主
  • 不会去查metadata,count(1)和count(*)的差别,最多也就是几个cpu时钟周期,所以追究哪个更快是没有意义的。

    想不想时已是想,不如不想都不想。

    谢谢。

    对实际的应用确实不会有很大的区别,我只是在理论上想在cpu时钟周期级别比较一下,不过如果确实能省几个CPU时钟周期,那也好啊,对吧?

    顺便问一下,你怎么知道不会去查metadata? 你是不是看到过source code?


    2012年5月14日 2:36
  • 联机丛书里面有很清楚的表述。

    COUNT(*) 返回指定表中行数而不删除副本。它对各行分别计数。包括包含空值的行。


    想不想时已是想,不如不想都不想。


    2012年5月14日 5:43
    版主
  • 我当然知道count(1)和count(*)的效率差不多了,

    我要的就是cpu时钟周期级别的比较,不然我也不会问这个问题了。


    2012年5月17日 5:04
  • LZ可以看一下这篇文章:sql server中count(*),count(col),count(1)的区别

    给我写信: QQ我:点击这里给我发消息

    2012年5月19日 9:48
  • 我看到的所以的答案就是执行计划级别的,从这方面来看肯定是一样的,我在问题中就已经说明了,这也不是我需要的答案。

    其实,我想知道的CPU周期级别的比较,在FORUM应该得不到答案了,我也觉得这样的比较只有那些熟悉source code的人才可能知道,先就这样吧。


    2012年5月19日 14:10
  • sorry,count(主键)是最慢的,应该说count(rowid)相对可能比较快。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    不知道你所说的“count(主键)无疑是最慢的”从哪方面考虑的?既然是主键,肯定不为空,对一个不为空的列取count跟count(*)是没有区别的,优化器肯定会使用其它索引的。
    2012年5月22日 3:42
  • 我看到的所以的答案就是执行计划级别的,从这方面来看肯定是一样的,我在问题中就已经说明了,这也不是我需要的答案。

    其实,我想知道的CPU周期级别的比较,在FORUM应该得不到答案了,我也觉得这样的比较只有那些熟悉source code的人才可能知道,先就这样吧。


    你打破砂锅问到底的精神是不错的,但是这不是作为DBA应有的态度。

    想不想时已是想,不如不想都不想。

    2012年5月29日 15:19
    版主
  • 我也觉得是,自己选自己为答案

    给我写信: QQ我:点击这里给我发消息

    2012年5月29日 15:50
  • 怡红公子:

    非常感谢上面的几次回复,不过我的回复好像跟态度没有什么关系吧?其实我在问问题之前就已经猜到很多会这样回答,所以我特定在问题中提了一下,好像很少有人明白我,除了你提到的“cpu时钟周期”之外:-)

    顺便说一下,这不是作为DBA应有的态度,但我不是DBA,嘻嘻

    桦仔:

    “自己选自己为答案”是这样的,因为我看到如果帖子长时间没有标记答案的话,会被管理员标记答案的,但管理员标记的答案很可能不是我想要的那个,所以就自己标记自己答案了,以免发生这种情况。



    2012年6月8日 2:47
  • 不是说你的回复,而是就这个问题来说。

    作为DBA,性能优化有一个重要的原则,就是“Know where to start. Know when to stop!”

    所以,探讨这个问题不是作为DBA应有的态度。当然,你不是DBA就是另外一回事了:p


    想不想时已是想,不如不想都不想。

    2012年6月9日 4:49
    版主
  • 嗯,完全同意你的观点。这个问题的讨论也只是纯粹理论上的。

    2012年6月9日 9:11