Postgres:数据类型 - 如何在PostgreSQL中存储uint64

10

PostgreSQL中的Bigint是8字节整数,具有与uint64一半的范围(因为一个比特用于签名整数)。

我需要对该列进行大量聚合,并且我认为在NUMERIC类型上进行聚合与整数类型相比较慢。

在这种情况下,我应该如何优化我的存储?


1
你确定你的操作不会使有符号的64位计数器溢出吗?为什么你认为它不会使无符号的64位计数器溢出? - Ivan Voras
我仍在学习Postgres,但似乎我们应该能够编写过程来执行我们的操作,如果有JIT(或其他优化编译器)参与,它理想情况下应该能够“编译它们”,因为每个CPU都支持无符号整数操作。 - Daniel Santos
在我的情况下,我正在解析二进制数据包中的数据。我存储的字段正好分配了8个字节,并编码为无符号整数。我还知道该字段可能最终会包装,因此我需要能够存储最大值。 - medley56
@medley56 如果您正在使用像 Go、C++ 或 Rust 这样的低级语言,那么您可以使用二进制字符串数据类型 bytea (https://www.postgresql.org/docs/15/functions-binarystring.html) 并将二进制数据作为二进制数据存储(只要您不在 SQL 中对此字段进行计算和聚合)。除此之外,您还可以使用非官方扩展,例如 https://github.com/petere/pguint。 - Ivan Voras
3个回答

11

除非你有具体的理由,否则请使用NUMERIC。它更慢,而且慢得相当多,但这可能并不像你想象的那样重要。

在SQL级别上,PostgreSQL不支持无符号64位整数,因此你没有其他选择。你可以添加一个新的数据类型作为扩展模块,但这将是很多工作。

你可以通过位运算将无符号64位整数压缩成有符号的64位整数,这样超过maxuint64/2的值就变成了负数。但这对于聚合来说是完全错误的,而且通常也非常丑陋。


3

3

还有一个扩展可以在PostgreSQL中提供额外的uint64数据类型。请参阅Github

该扩展是由Peter Eisentraut创建的。


1
在PGXN上还有varint扩展。 - tcyrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接