罗宾斯·塔拉坎:在Postgres 19中解决COUNT(*)与COUNT(1)的争论
内容提要
最近,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版本的更新主要针对SELECT COUNT(h)的性能进行了优化,提升幅度可达64%。这一改进特别适用于NOT NULL列,意味着在处理大数据集时,用户可以显著减少查询时间,提升数据库的整体效率。
优化的适用范围
虽然新特性使得COUNT(1)和COUNT(id)的性能与COUNT(*)相当,但该优化并不适用于COUNT(nullable_col)和COUNT(DISTINCT h)等情况。用户在使用这些函数时仍需注意性能差异,避免在不适用的场景中期待性能提升。
未来优化的可能性
此次更新为未来的进一步优化奠定了基础,例如COUNT(NULL)的优化可能会在未来实现,允许直接返回0而无需扫描行。这表明PostgreSQL在性能优化方面仍有很大的发展潜力,用户应关注后续版本的更新。
延伸问答
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。