postgresql中的Bigint是8字节整数。它的范围是uint64的一半(一位用来表示整数)
我需要对列进行大量聚合,并且我认为与整数类型相比,NUMERIC类型的聚合速度较慢。
在这种情况下,我应该如何优化存储?
答案 0 :(得分:1)
除非您有具体原因,否则请使用NUMERIC
。 更慢,速度慢得多,但这可能并不像你想象的那么重要。
你没有任何替代选择,因为PostgreSQL不支持SQL级别的无符号64位整数。您可以添加一个新的数据类型作为扩展模块,但它需要做很多工作。
您可以将无符号64位int按位推入64位有符号整数,因此maxuint64 / 2以上的值为负数。但是,对于聚合而言,这将完全被打破,并且通常会非常难看。
答案 1 :(得分:1)
sum()
, numeric
将返回bigint
,因此不会溢出
select sum(a)
from (values (9223372036854775807::bigint), (9223372036854775807)) s(a)
;
sum
----------------------
18446744073709551614
http://www.postgresql.org/docs/current/static/functions-aggregate.html
答案 2 :(得分:0)
还有一个扩展,可在postgresql中提供其他uint64数据类型。参见Github