2011-08-19 111 views
12

可能重复:
Count(*) vs Count(1)SQL最佳实践:计数(1)或COUNT(*)

我记得有传言称被告知:

从未使用count( *)当计数(1)将做

最近我把这个建议传给了另一个开发者,并且被证明这是真的。我的观点是我得到建议时告诉我的:数据库只会返回第一列,然后将被计数。反驳是数据库不会评估括号中的任何内容。

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

我在使用Sybase时得到了这个建议,而且表有数以百万计的行。我现在正在使用Oracle,而且数据少得多。

所以我想总的来说,我的两个问题是:

  1. 这是更快,计数(1)或COUNT(*)?
  2. 这会因不同的数据库供应商而有所不同吗?
+1

1. ANSI SQL定义'COUNT(*)'应该优化2.这适用于大多数RDBMS。别的仅适用于旧版本的*另有说明,否则*承担COUNT(*)进行了优化。 – gbn

回答

13

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

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

+0

+1添加Oracle链接 – gbn

-3
  1. 计数(1)
  2. 没有,通常来说这总是会有表现略好。

这只会影响如果放大到一个很大的数额,但这是一个很好的做法。

+3

不,不。神话。 -1。除了重复之外,您还可以在[DBA.SE](http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany -non-null-col/2512#2512) – gbn

+1

我认为这样做是正确的,因为count(1)总是会有稍微好一点的性能。 – hatchet

+2

您是否有任何文件支持这种违反传统智慧的行为? – dkretz

4

在阅读专门针对TSQL和Microsoft SQL Server的书籍时,我已经读过使用*更好,因为它可以让优化器决定最佳做法。我会尽力找到具体书籍的名称并在这里发布。

+0

这也适用于使用“exists(select * from ...)”与“exists(从...中选择字段)” –

+0

count(*)是一种常见的习惯用法,任何优化器应该考虑到它,而不仅仅是SQL Server。我希望我有证据支持这一点。 –

+0

@Mark Ransom:在ANSI标准中http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany-non-null-col/2512 #2512 – gbn

3

这是一个基本的查询模式,其含义是相同的。我不止一次读过优化器对待它们 - 现在找不到具体的参考资料,但将其放在“机构知识”的类别中。

(应搜索的第一个... HTTP://stackoverflow.com/questions/1221559/count-vs-count1)

1

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

2

我只能到SQL Server说话,但在测试在5 GB表,11毫米记录 - 的读操作数和执行计划是相同的。

我说没有区别。