只是想知道你们中是否有人在使用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 月
编辑,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 中都是(可能)相同的。