我想知道Count(1)与Count(*),是否有明显的差异
(具体的数据库是SQL Server 2005.)
在SQL Server中,这些语句功能相同。
与流行的观点相反,在oracle他们也是如此。
SYS_GUID() 在Oracle中是相当计算密集的功能。
在我的测试数据库中,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 ( { [ [ 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
案件:
a)如果指定了COUNT(*),那么结果是T的基数。
也就是说,ANSI标准认为这是你的意思。由于这个迷信,COUNT(1)已经被RDBMS供应商优化了。否则,将根据ANSI进行评估
b)否则,令TX为单列表格,这是将<值表达式>应用于T的每一行并消除空值的结果。如果一个或多个空值被消除,则提出完成条件:警告 -