协慌网

登录 贡献 社区

Count(*)vs Count(1)-SQL Server

只是想知道你们中是否有人在使用Count(1)不是Count(*)并且在性能上是否存在明显差异,或者这仅仅是过去的日子所养成的传统习惯?

特定的数据库是SQL Server 2005

答案

没有区别。

原因:

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

“1” 是一个非 null 表达式:因此它与COUNT(*)相同。优化器可以识别它是什么:琐碎的。

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.SE 的类似问题

编辑,2011 年 12 月

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

案件:

a)如果指定了 COUNT(*),则结果为 T 的基数。

就是说,ANSI 标准将其识别为明显的含义。由于这种迷信, COUNT(1)已由 RDBMS 供应商进行了优化。否则将按照 ANSI 进行评估

b)否则,将 TX 设为单列表,这是对 并消除空值的结果。如果消除了一个或多个空值,则会引发完成条件: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)始终返回相同的结果。因此,如果一个慢于另一个,那实际上是由于优化程序错误所致。由于两种形式在查询中都非常频繁地使用,因此 DBMS 不允许此类错误保持未解决状态是没有意义的。因此,您会发现两种形式的性能在所有主要的 SQL DBMS 中都是(可能)相同的。