每个记录有7个8位整数值,我想存储在Postgres中.Pg不提供单字节整数类型SMALLINT或2字节,即最小的整数数据类型.有没有什么方法可以存储我的7-8位数字并节省空间?
7元素数组的数组类型会更紧凑吗?或者,我应该对我的7个数字进行二进制表示(例如,在Perl中使用pack)并将其存储在一个bytea字段中吗?
还有其他建议吗?
每个记录有7个8位整数值,我想存储在Postgres中.Pg不提供单字节整数类型SMALLINT或2字节,即最小的整数数据类型.有没有什么方法可以存储我的7-8位数字并节省空间?
7元素数组的数组类型会更紧凑吗?或者,我应该对我的7个数字进行二进制表示(例如,在Perl中使用pack)并将其存储在一个bytea字段中吗?
还有其他建议吗?
考虑到PostgreSQL中任何一行的开销都是23 bytes(HeapTupleHeaderData),如果你真的这么在意少量的空间,那么你可能 Select 了错误的数据存储方式.
不管怎样,因为所有更复杂的类型都有自己的开销(bytea会增加四个字节的开销,例如,位字符串5到8),所以实现所需的唯一方法是使用bigint(8字节),对每个值进行数字移位,或将结果合并在一起.您可以使用bit string operations来简化代码——以位字符串的形式计算,然后在存储之前转换为bigint——或者如果希望速度更快,只需手动乘法/加法.例如,以下是如何将两个字节存储到一个两字节的 struct 中,然后再将它们取回:
int2 = 256 * byte1 + byte2
byte1 = int2 / 256
byte2 = int2 % 256
你可以将同样的 idea 扩展到以这种方式存储其中7个.检索开销仍然会很糟糕,但实际上在这个过程中您已经节省了一些空间.但与行标题的关系不大.