计数 (\*) 与计数 (1) - SQL Server

新手上路,请多包涵

只是想知道你们中是否有人使用 Count(1) 而不是 Count(*) 以及性能是否存在明显差异,或者这只是过去几天提出的遗留习惯?

具体数据库为 SQL Server 2005

原文由 super9 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 439
2 个回答

没有区别。

原因:

网上书 说“ 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 的每一行并消除空值的结果。如果消除了一个或多个空值,则提出完成条件:警告-

原文由 gbn 发布,翻译遵循 CC BY-SA 3.0 许可协议

在所有 RDBMS 中,这两种计数方式在产生的结果方面是等价的。关于性能,我没有观察到 SQL Server 中的任何性能差异,但可能值得指出的是,某些 RDBMS, 例如 PostgreSQL 11,对于 COUNT(1) 的优化实现较少,因为它们检查参数表达式的可空性为可以在这个帖子中看到

我发现运行时 1M 行有 10% 的性能差异:

 -- Faster
SELECT COUNT(*) FROM t;

-- 10% slower
SELECT COUNT(1) FROM t;

原文由 Lukas Eder 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进