我有以下代码:
SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;
如果我用COUNT('x')替换COUNT(*),结果或性能是否有任何差异?
(此问题与previous one)
有关答案 0 :(得分:14)
要说SELECT COUNT(*) vs COUNT(1)
导致你的DBMS返回“列”是纯粹的铺位。 可能很久很久以前就是这种情况,但任何自尊的查询优化器都会选择一些快速的方法来计算表中的行数 - NO 之间存在 NO 性能差异SELECT COUNT(*), COUNT(1), COUNT('this is a silly conversation')
此外,SELECT(1) vs SELECT(*)
在INDEX使用方面没有任何区别 - 大多数DBMS实际上都会优化SELECT( n ) into SELECT(*)
。请参阅ASK TOM:Oracle在过去十年的大部分时间内一直在优化SELECT(n) into SELECT(*)
,如果不是更长时间:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789
问题是在count(col)中计数() 转变 ** 03/23/00 05:46 pm ***一个解决方法是将事件10122设置为 关闭计数(col) - &gt; count() 优化。另一项工作是 将计数(col)更改为count(), 它意味着相同,当col有一个 NOT NULL约束。错误号码是 1215372。
有一点需要注意 - 如果你使用COUNT(col)(不要!)并且col被标记为NULL,那么它实际上必须计算表中出现的次数(通过索引扫描,直方图,等等,如果它们存在,或者全表扫描,否则)。
底线:如果您想要的是表中的行数,请使用COUNT(*)
答案 1 :(得分:5)
答案 2 :(得分:3)
主要的性能差异是通过检查表上的主键可以满足COUNT(*)。
即。在下面的简单案例中,查询将立即返回,而无需检查任何行。
select count(*) from table
我不确定SQL Server中的查询优化器是否会这样做,但在上面的示例中,如果要分组的列有一个索引,则服务器应该能够满足查询而无需访问实际的表所有
澄清一下:这个答案特指SQL Server。我不知道其他DBMS产品如何处理这个问题。
答案 3 :(得分:3)
这个问题与另一个引用的问题略有不同。在引用的问题中,有人问到使用count(*)和count(SomeColumnName)时有什么区别,并且SQLMenace's answer是现货。
要解决这个问题,结果基本上没有区别。 count(*)和count('x')以及count(1)都将返回相同的数字。不同之处在于,当使用“*”时,就像在SELECT中一样,返回所有列,然后计数。当使用常量(例如'x'或1)时,返回具有一列的行然后计数。当“*”返回许多列时,会看到性能差异。
更新:上述关于性能的声明可能不太正确,如其他答案中所讨论的那样,但在使用EXISTS和NOT EXISTS时适用于子选择查询
答案 4 :(得分:1)
MySQL:根据MySQL网站,使用MyISAM时,COUNT(*)
对单表查询的速度更快:
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count
我猜测有一个带有计数的子句可能会改变一些事情。