可能重复:
Count(*) vs Count(1)
我记得有传闻说:
当count(1)执行
时,永远不要使用count(*)
最近我把这个建议传递给了另一位开发人员,并且被要求证明这是真的。当我得到建议时,我的论点就是我被告知的情况:数据库只返回第一列,然后计算。反驳的是,数据库不会评估括号中的任何内容。
对小桌子的一些(不科学的)测试,似乎没有区别。我目前无权访问任何大型表格进行试验。
当我使用Sybase时,我得到了这个建议,而且表有数亿行。我现在正在使用Oracle并且数据少得多。
所以我总结一下,我的两个问题是:
答案 0 :(得分:16)
根据另一个类似问题(Count(*) vs Count(1)),它们是相同的。
在Oracle中,根据Ask Tom,count(*)是计算行数的正确方法,因为优化程序将count(1)更改为count(*)。 count(1)实际上意味着计算非空1的行(所有这些都是非空的,因此优化器会为你改变它)。
答案 1 :(得分:7)
见
What is better in MYSQL count(*) or count(1)?
用于MYSQL(count(*)和count(1)之间没有区别)
http://beyondrelational.com/blogs/dave_ballantyne/archive/2010/07/27/count-or-count-1.aspx
用于MS Sql Server(没有区别)
http://dbaspot.com/sybase/349079-count-vs-count-1-a.html
for Sybase(没有区别)
答案 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)
这只会影响到升级到大幅度,但这是一种很好的做法。