PostgreSQL码农集散地

PostgreSQL 19 - SQL整型聚合运算中间结果"128 位整数"增强

PostgreSQL 19 preview - SQL整型聚合运算中间结果"128 位整数"操作增强

https://github.com/postgres/postgres/commit/d699687b329e031cd90e967b39c3fd8a53ef8208

Extend int128.h to support more numeric code.

主要提升SQL类型int2,4,8的内部聚合运算的中间结果采用numeric性能较差, 有大量运算可以采用int128提升性能, 本次提交增加了一些中间运算的函数支持.

主要内容

本提交扩展了 int128.h,增加了更多对 128 位整数操作的支持,使 PostgreSQL 的 numeric 代码在所有平台上都能用 128 位整数提升聚合性能,并大幅简化了相关条件编译逻辑。主要涉及:

  • 为 int128.h 增加了更多辅助函数,比如 128 位整数的加减、乘法、除法、序列化/反序列化等。
  • 聚合函数如 SUM(int8)、AVG(int8)、STDDEV_POP(int2|int4)、STDDEV_SAMP(int2|int4)、VAR_POP(int2|int4)、VAR_SAMP(int2|int4) 现在都能在所有平台上使用 128 位整数做中间计算(原来只有支持原生 128 位整数的平台才行),对性能和准确性都有提升。
  • 代码大量去除了 #ifdef HAVE_INT128 条件编译,逻辑更简洁。
  • 增加了新的测试代码,验证新增的 128 位整数操作正确性。
  • 增加了一些回归测试用例,确保数值聚合相关行为一致。

示例/用法

以 int8 类型举例,有了此提交,无论平台是否原生支持 int128,以下 SQL 聚合在内部都将使用高效的 128 位整数作为中间结果,避免因溢出或精度问题回退到较慢的 numeric 算法:

-- 计算大整数的和  
SELECTSUM(bigint_col) FROM your_table;  

-- 计算大整数的平均值  
SELECTAVG(bigint_col) FROM your_table;  

-- 计算标准差和方差  
SELECTSTDDEV_POP(int_col) FROM your_table;  
SELECT VAR_POP(int_col) FROM your_table;  

在提交中也有如下测试用例(见 aggregates.sql/aggregates.out):

SELECTsum(q1+q2), sum(q1)+sum(q2) FROM int8_tbl;  
SELECTsum(q1*2000), sum(-q1*2000), 2000*sum(q1) FROM int8_tbl;  

这些聚合表达式会直接调用新的 128 位整数聚合路径。

影响

  • 性能提升:聚合大整数类型时更快,尤其在原本不支持 int128 的平台上收益明显。
  • 精度保证:更大范围的整数聚合不会频繁溢出到 numeric 路径,保证结果精确。
  • 代码更整洁:减少了平台差异导致的复杂条件编译。
  • 开发者可以更放心地在聚合涉及大整数时使用 PostgreSQL 内建聚合函数,无需担心平台兼容性问题。

总结

这是一次提升 PostgreSQL 聚合性能、简化代码并增强精度的重要提交。你可以直接用标准 SQL 聚合函数受益于这些改进,无须对 SQL 写法做任何调整。