罗宾斯·塔拉坎:在Postgres 19中解决COUNT(*)与COUNT(1)的争论

💡 原文英文,约700词,阅读约需3分钟。
📝

内容提要

最近,PostgreSQL主分支更新优化了SELECT COUNT(h)的性能,提升可达64%。新特性允许查询优化器在特定情况下将COUNT(ANY)转换为COUNT(*),减少数据提取和空值检查的开销。这一改进将包含在PostgreSQL 19版本中,用户在使用COUNT(1)或COUNT(id)时将自动获得COUNT(*)的最佳性能。

🎯

关键要点

  • PostgreSQL主分支最近更新了SELECT COUNT(h)的性能,提升可达64%。
  • 新特性允许查询优化器在特定情况下将COUNT(ANY)转换为COUNT(*),减少数据提取和空值检查的开销。
  • 这一改进将包含在PostgreSQL 19版本中,用户在使用COUNT(1)或COUNT(id)时将自动获得COUNT(*)的最佳性能。
  • 优化主要针对NOT NULL列,COUNT(nullable_col)和COUNT(DISTINCT h)等情况不适用此优化。
  • 优化的关键在于减少了列数据的提取,节省了CPU周期。

延伸问答

PostgreSQL 19中COUNT(h)的性能提升了多少?

性能提升可达64%。

COUNT(ANY)在PostgreSQL 19中有什么变化?

COUNT(ANY)可以在特定情况下被转换为COUNT(*),从而减少数据提取和空值检查的开销。

使用COUNT(1)或COUNT(id)时会有什么好处?

用户将自动获得COUNT(*)的最佳性能。

哪些情况下COUNT(nullable_col)不适用此优化?

COUNT(nullable_col)不适用此优化,因为无法保证列中没有NULL值。

为什么COUNT(h)的性能会提高?

因为优化后COUNT(h)可以跳过列数据的提取,节省了CPU周期。

PostgreSQL 19的优化对未来有什么影响?

新基础设施为进一步优化提供了可能性,例如COUNT(NULL)可以理论上优化为直接返回0。

➡️

继续阅读