COUNT(1) 还是 COUNT(*) 对 PostgreSQL 更好
Is COUNT(1) or COUNT(*) better for PostgreSQL
我已经看到其他数据库(MySQL、SQL 服务器等)对这个问题的回答,但 PostgreSQL 没有。那么,COUNT(1)
还是 COUNT(*)
faster/better 用于选择 table 的行数?
对比差异
我上次 benchmarked the difference between COUNT(*)
and COUNT(1)
for PostgreSQL 11.3, I've found that COUNT(*)
was about 10% faster. The explanation by Vik Fearing at the time 一直在为整个计数循环评估常量表达式 1
(或至少它的可空性)。我还没有检查这是否已在 PostgreSQL 14.
中修复
在现实世界的查询中不要担心这个
不过,您不必担心这种性能差异。 10% 的差异在基准测试中是可以测量的,但我怀疑您能否在普通查询中始终如一地测量这种差异。此外,理想情况下,所有 SQL 供应商都以相同的方式优化这两件事,因为 1
是一个常量表达式,因此可以消除。正如上面文章中提到的,我在我测试过的任何其他 RDBMS(MySQL、Oracle、SQL Server)中都找不到任何区别,而且我不希望有任何区别差异。
我已经看到其他数据库(MySQL、SQL 服务器等)对这个问题的回答,但 PostgreSQL 没有。那么,COUNT(1)
还是 COUNT(*)
faster/better 用于选择 table 的行数?
对比差异
我上次 benchmarked the difference between COUNT(*)
and COUNT(1)
for PostgreSQL 11.3, I've found that COUNT(*)
was about 10% faster. The explanation by Vik Fearing at the time 一直在为整个计数循环评估常量表达式 1
(或至少它的可空性)。我还没有检查这是否已在 PostgreSQL 14.
在现实世界的查询中不要担心这个
不过,您不必担心这种性能差异。 10% 的差异在基准测试中是可以测量的,但我怀疑您能否在普通查询中始终如一地测量这种差异。此外,理想情况下,所有 SQL 供应商都以相同的方式优化这两件事,因为 1
是一个常量表达式,因此可以消除。正如上面文章中提到的,我在我测试过的任何其他 RDBMS(MySQL、Oracle、SQL Server)中都找不到任何区别,而且我不希望有任何区别差异。