Is COUNT(1) or COUNT(*) better for PostgreSQL



我在其他数据库(MySQL、SQL Server等(中看到了这个问题的答案,但在PostgreSQL中没有。那么,COUNT(1)还是COUNT(*)更快/更好地选择表的行数呢?

差异基准

上一次我为PostgreSQL 11.3测试COUNT(*)COUNT(1)之间的差异时,我发现COUNT(*)大约快了10%。Vik Fearing当时的解释是,正在为整个计数循环评估常数表达式1(或至少其可为空性(。我还没有检查PostgreSQL 14中是否已经修复了这个问题。

在现实世界中的查询中不要担心这一点

但是,您不应该担心这样的性能差异。10%的差异在基准中是可以测量的,但我怀疑你能否在普通查询中始终如一地测量这种差异。此外,理想情况下,所有SQL供应商都以相同的方式优化这两件事,因为1是一个常量表达式,因此可以消除。正如在上面的文章中提到的,我在我测试过的任何其他RDBMS(MySQL、Oracle、SQL Server(中都找不到任何区别,我也不认为会有任何区别。

作为一个额外的数据点,PostgreSQL似乎确实以不同的方式解释了不同的COUNT语句。我有一个在PostgreSQL 14.3上运行的有4000万条记录的表,这些是我得到的结果:

select count(1) from "DATA" p -- 2m3s, 2m3s, 2m17s
select count(*) from "DATA" p -- 4m39s, 4m39s, 3m16s
select count(distinct "ID") from "DATA" p -- 4m39, 4m46s
select count("ID") from "DATA" p -- 2m31s, 2m25s

这似乎表明COUNT(1(通常比COUNT((*(更好。计时已经进行了几次,一次接一次,所以应该非常准确。

最新更新