每个记录有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个.检索开销仍然会很糟糕,但实际上在这个过程中您已经节省了一些空间.但与行标题的关系不大.

Postgresql相关问答推荐

如何使用Docker安装PostgreSQL扩展

哪种数据类型是除法的结果?

Psql:Windows 10上奇怪的错误输出编码

错误:用户需要系统密码:postgres

如何创建一个触发器来传播对主键表的更新?

如何将两条线几何连接成一条记录?

在 KnexJS 中插入

我应该使用哪个 postgresql 包?

Nodemon - 安装期间clean exit - waiting for changes before restart

如何使用 ActiveRecord json 字段类型

如何从 WSL 连接到 windows postgres 数据库

带有双引号的 postgresql COPY 和 CSV 数据

如何使用 psql 命令列出、创建、使用和判断数据库?

Rails ActiveRecord - 如何获取两个日期之间的记录

NOT LIKE 带有 NULL 值的行为

Postgis 中 2 点之间的距离,单位为 4326 米

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

Entity Framework Core jsonb 列类型

如何在我的 Mac 上卸载 postgresql(运行 Snow Leopard)

Heroku 上的 Postgres 并将单个表转储到转储文件