计数(*)与计数(1)

只是想知道你们中的任何一个人是否使用Count(1)不是Count(*)并且如果在性能上存在显着差异,或者这只是从过去的日子中提出的遗留习惯?

(特定数据库是SQL Server 2005


没有区别。

原因:

网上书籍说“ COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

“1”是一个非空的表达式:因此它与COUNT(*)相同。 优化器认识到它是什么:微不足道。

EXISTS (SELECT * ...相同EXISTS (SELECT * ...EXISTS (SELECT 1 ...

例:

SELECT COUNT(1) FROM dbo.tab800krows
SELECT COUNT(1),FKID FROM dbo.tab800krows GROUP BY FKID

SELECT COUNT(*) FROM dbo.tab800krows
SELECT COUNT(*),FKID FROM dbo.tab800krows GROUP BY FKID

同样的IO,相同的计划,作品

编辑,2011年8月

关于DBA.SAE的类似问题

编辑,2011年12月

在ANSI-92中特别提及COUNT(*) (查找“ Scalar expressions 125 ”)

案件:

a)如果指定了COUNT(*),那么结果就是T的基数。

也就是说,ANSI标准认为它显然是你的意思。 由于这种迷信, COUNT(1)已经由RDBMS供应商进行了优化。 否则,将根据ANSI评估

b)否则,让TX为单列表格,这是将<值表达式>应用于T的每一行并消除空值的结果。 如果消除了一个或多个空值,则会发出完成条件:warning-


在SQL Server中,这些语句产生相同的计划。

与流行的观点相反,在甲骨文他们也是如此。

Oracle中的SYS_GUID()是相当计算量的函数。

在我的测试数据库中, t_even是一个包含1,000,000行的表

这个查询:

SELECT  COUNT(SYS_GUID())
FROM    t_even

运行48秒,因为函数需要评估每个返回的SYS_GUID() ,以确保它不是NULL

但是,这个查询:

SELECT  COUNT(*)
FROM    (
        SELECT  SYS_GUID()
        FROM    t_even
        )

运行时间为2秒,因为它甚至不尝试评估SYS_GUID() (尽管*是作为COUNT(*)参数)


显然,COUNT(*)和COUNT(1)将始终返回相同的结果。 因此,如果其中一个比另一个慢,这实际上是由于优化器错误。 由于这两种形式在查询中都非常频繁地使用,因此数据库管理系统允许这样的错误保持不固定是没有意义的。 因此,您会发现两种表单的性能在所有主要的SQL DBMS中可能都是相同的。

链接地址: http://www.djcxy.com/p/66619.html

上一篇: Count(*) vs Count(1)

下一篇: Scala and Java with Maven in default eclipse