Postgres中如何处理BigNumber运算 实现uint256类型多行SUM聚合
PostgreSQL uint256 数值运算与聚合实现方案
- 首选成熟扩展
pg_bignum:该扩展基于GMP数学库实现了任意精度的整数、浮点数原生运算,完美支持uint256这类32字节超大无符号整数的四则运算、聚合操作。你可以直接将uint256数值存储为扩展提供的bignum类型,不需要手动转字符串或bytea处理,直接调用标准SQL的SUM()函数即可完成多行聚合运算,性能比全量拉取数据后在应用层reduce求和高2~3个数量级,完全适配高频求和的业务需求。 - 若业务要求必须用bytea类型存储原始32字节uint256数据,可基于
pg_bignum封装自定义转换逻辑:- 先编写
bytea_to_uint256自定义函数,按照你存储的大小端规则将32字节bytea值转换为bignum类型 - 自定义聚合函数
uint256_sum(bytea),内部自动对每行bytea做类型转换后再执行求和聚合,业务侧调用方式和普通SUM函数完全一致,不需要修改上层业务逻辑
- 先编写
- 无扩展环境替代方案:如果使用的是托管PG实例不支持安装第三方扩展,可以将uint256拆分为高128位、低128位两个
numeric类型字段分开存储,自定义聚合逻辑分别对高低位求和后处理进位即可。该方案不需要依赖额外扩展,但需要自行维护运算逻辑,出错概率高,性能也远低于pg_bignum方案,仅作为限制环境下的备选。
注意:安装
pg_bignum前需要先在PG所在服务器安装GMP依赖库,绝大多数Linux发行版可直接通过包管理器安装gmp-devel(RHEL系)或libgmp-dev(Debian系)包,扩展编译完成后在对应数据库执行CREATE EXTENSION bignum;即可启用。
内容的提问来源于stack exchange,提问作者BANO notIT
相关产品推荐
相关产品推荐

