SQL最佳实践:count(1)或count(*)

时间:2011-08-19 16:22:35

标签: sql

  

可能重复:
  Count(*) vs Count(1)

我记得有传闻说:

  

当count(1)执行

时,永远不要使用count(*)

最近我把这个建议传递给了另一位开发人员,并且被要求证明这是真的。当我得到建议时,我的论点就是我被告知的情况:数据库只返回第一列,然后计算。反驳的是,数据库不会评估括号中的任何内容。

对小桌子的一些(不科学的)测试,似乎没有区别。我目前无权访问任何大型表格进行试验。

当我使用Sybase时,我得到了这个建议,而且表有数亿行。我现在正在使用Oracle并且数据少得多。

所以我总结一下,我的两个问题是:

  1. 哪个更快,计数(1)还是计数(*)?
  2. 不同的数据库供应商会有所不同吗?

7 个答案:

答案 0 :(得分:16)

根据另一个类似问题(Count(*) vs Count(1)),它们是相同的。

在Oracle中,根据Ask Tom,count(*)是计算行数的正确方法,因为优化程序将count(1)更改为count(*)。 count(1)实际上意味着计算非空1的行(所有这些都是非空的,因此优化器会为你改变它)。

答案 1 :(得分:7)

答案 2 :(得分:4)

在专门阅读有关TSQL和Microsoft SQL Server的书籍时,我已经读过使用*更好,因为它让优化器决定最好做什么。我将尝试找到特定书籍的名称并在此处发布。

答案 3 :(得分:3)

这是一个基本的查询模式,含义相同。我不止一次地读过优化器同样对待它们 - 现在找不到具体的参考,但把它放在“机构知识”的范畴内。

(应先搜索... http://stackoverflow.com/questions/1221559/count-vs-count1)

答案 4 :(得分:2)

我只能说SQL Server,但是在5 GB表上测试,11 mm记录 - 读取次数和执行计划都是相同的。

我说没有区别。

答案 5 :(得分:1)

据我所知,使用count()应该更快,因为当调用该函数时,引擎只计算索引。从另一个角度来看,二进制代码中的count()和count(1)看起来非常相似,所以应该没有区别。

答案 6 :(得分:-6)

  1. 计数(1)
  2. 不,一般来说,这种性能总会略好一些。
  3. 这只会影响到升级到大幅度,但这是一种很好的做法。