罗宾斯·塔拉坎:在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。
➡️