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

28 浏览
0 Comments

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

我想知道你们有没有使用 Count(1) 而非 Count(*),并且是否在性能上有明显的差别,或者是否只是从过去延续下来的一种遗留习惯?

具体数据库是 SQL Server 2005

admin 更改状态以发布 2023年5月23日
0
0 Comments

\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(*)的参数)。

0
0 Comments

没有区别。

原因:

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月

DBA.SE上类似的问题

编辑,2011年12月

COUNT(*)ANSI-92中明确提到(查找"Scalar expressions 125")

情况:

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

也就是说,ANSI标准认为你的意思是显而易见的。COUNT(1)被RDBMS供应商优化掉了,因为这种迷信。否则,它将按照ANSI计算。

b)否则,让TX成为单列表,该表是将应用于T的每一行并消除空值的结果。如果消除了一个或多个空值,则引发完成条件:警告-

0