计数(*)与计数(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)