首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Count(*) vs Count(1) - SQL Server

Count(*) vs Count(1) - SQL Server
EN

Stack Overflow用户
提问于 2009-08-03 18:15:11
回答 14查看 452K关注 0票数 805

只是想知道你们中是否有人使用Count(1)而不是Count(*),在性能上是否有显着的差异,或者这只是一个从过去的日子里继承下来的习惯?

具体数据库为SQL Server 2005

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-08-03 10:36:52

这是没有区别的。

原因:

Books on-line说"COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

"1“是一个非空表达式:因此它与COUNT(*)相同。优化器识别出它的本质:微不足道。

EXISTS (SELECT * ...EXISTS (SELECT 1 ...相同

示例:

代码语言:javascript
运行
复制
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月

Similar question on DBA.SE

编辑,2011年12月

ANSI-92中特别提到了COUNT(*) (查找"Scalar expressions 125")

案例:

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

也就是说,ANSI标准将其识别为显而易见的意思。由于这种迷信,COUNT(1)已经被关系型数据库供应商优化了。否则,它将按照ANSI进行计算

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

票数 658
EN

Stack Overflow用户

发布于 2009-08-03 10:34:38

在SQL Server中,这些语句生成相同的计划。

与流行的观点相反,在甲骨文中也是如此。

Oracle中的SYS_GUID()是一个计算密集型函数。

在我的测试数据库中,t_even是一个包含1,000,000行的表

此查询:

代码语言:javascript
运行
复制
SELECT  COUNT(SYS_GUID())
FROM    t_even

运行48秒,因为函数需要计算返回的每个SYS_GUID(),以确保它不是NULL

但是,此查询:

代码语言:javascript
运行
复制
SELECT  COUNT(*)
FROM    (
        SELECT  SYS_GUID()
        FROM    t_even
        )

运行时间只有2秒,因为它甚至不会尝试计算SYS_GUID() (尽管*COUNT(*)的参数)

票数 77
EN

Stack Overflow用户

发布于 2009-08-03 10:45:17

显然,COUNT(*)COUNT(1)将返回相同的结果。因此,如果其中一个比另一个慢,这实际上是由于优化器的错误。由于这两种形式在查询中都非常频繁地使用,因此DBMS允许此类错误保持不被修复是没有意义的。因此,您会发现,在所有主要的SQL DBMS中,这两种形式的性能(可能)是相同的。

票数 72
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1221559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档