Count(*)与Count(1) - SQL Server
Count(*)与Count(1) - SQL Server
我想知道你们有没有使用 Count(1)
而非 Count(*)
,并且是否在性能上有明显的差别,或者是否只是从过去延续下来的一种遗留习惯?
具体数据库是 SQL Server 2005
。
admin 更改状态以发布 2023年5月23日
\n\n在SQL Server中,这些语句产生相同的计划。\n与普遍的看法相反,在Oracle中也是这样。\n在Oracle中,SYS_GUID()
是一个非常计算密集的函数。\n在我的测试数据库中,t_even
是一个有1,000,000
行的表。\n这个查询:\n
SELECT COUNT(SYS_GUID()) FROM t_even
\n运行了48
秒,因为该函数需要评估每个返回的SYS_GUID()
,以确保它不是NULL
。\n然而,这个查询:\n
SELECT COUNT(*) FROM ( SELECT SYS_GUID() FROM t_even )
\n运行了2
秒,因为它甚至不尝试评估SYS_GUID()
(尽管*
是COUNT(*)
的参数)。
没有区别。
原因:
Books on-line说"
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
"
"1"是一个非空表达式:所以它和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月
COUNT(*)
在ANSI-92中明确提到(查找"Scalar expressions 125
")
情况:
a)如果指定了COUNT(*),则结果是T的基数。
也就是说,ANSI标准认为你的意思是显而易见的。COUNT(1)
被RDBMS供应商优化掉了,因为这种迷信。否则,它将按照ANSI计算。
b)否则,让TX成为单列表,该表是将
应用于T的每一行并消除空值的结果。如果消除了一个或多个空值,则引发完成条件:警告-