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 写法做任何调整。