PostgreSQL中的Bigint是8字节整数,具有与uint64一半的范围(因为一个比特用于签名整数)。
我需要对该列进行大量聚合,并且我认为在NUMERIC类型上进行聚合与整数类型相比较慢。
在这种情况下,我应该如何优化我的存储?
PostgreSQL中的Bigint是8字节整数,具有与uint64一半的范围(因为一个比特用于签名整数)。
我需要对该列进行大量聚合,并且我认为在NUMERIC类型上进行聚合与整数类型相比较慢。
在这种情况下,我应该如何优化我的存储?
除非你有具体的理由,否则请使用NUMERIC
。它会更慢,而且慢得相当多,但这可能并不像你想象的那样重要。
在SQL级别上,PostgreSQL不支持无符号64位整数,因此你没有其他选择。你可以添加一个新的数据类型作为扩展模块,但这将是很多工作。
你可以通过位运算将无符号64位整数压缩成有符号的64位整数,这样超过maxuint64/2的值就变成了负数。但这对于聚合来说是完全错误的,而且通常也非常丑陋。
sum()
函数会在输入为 bigint
时返回 numeric
,因此不会溢出。
select sum(a)
from (values (9223372036854775807::bigint), (9223372036854775807)) s(a)
;
sum
----------------------
18446744073709551614
http://www.postgresql.org/docs/current/static/functions-aggregate.html
bytea
(https://www.postgresql.org/docs/15/functions-binarystring.html) 并将二进制数据作为二进制数据存储(只要您不在 SQL 中对此字段进行计算和聚合)。除此之外,您还可以使用非官方扩展,例如 https://github.com/petere/pguint。 - Ivan Voras