首页 > 解决方案 > 在 PostgreSQL 中存储未使用的数据块的最有效方法

问题描述

一个表中的列很少,大约有 100 多列基于数据,只需要存储这些数据以供以后导出到另一个源。

这些数据(除了提到的前几列)不需要被索引/过滤或以某种方式进行操作。没有可以以任何方式检查此数据的查询。

唯一的事情是,该应用程序层可以检索具有额外未使用工作负载的整行并将其反序列化以进一步转换为外部格式。

有一个想法是将整个类序列化到这个字段中,但后来我们意识到,这对于数据大小来说是一个巨大的开销(因为额外的 java 类元数据)。 所以这是一个简单的键值数据(键集是静态的,正如关系模型所暗示的那样)。

就数据库性能(50+ TB 存储)而言,在 PostgreSQL 中存储这些额外未使用数据的正确方法和数据类型是什么?也许值得省略键数据并仅将值存储为数组(因为键是静态的)并在应用层通过索引反序列化后获取值(因为首先是数据库性能)?

标签: javapostgresqldatabase-designdatabase-performance

解决方案


a_horse_with_no_name,非常感谢,但jsonb它确实是一种棘手的数据类型。

就包含 的单个元组所需的字节数而言jsonb,必须始终牢记 -格式中key名称的大小。json这样,如果有人想重新发明轮子并将大key名称存储为单个byte索引 - 它会减少整体元组大小,但并不比将所有数据存储为典型的关系表字段更好,因为TOAST算法适用于这两种情况。

另一种方法是对单个字段使用EXTERNAL存储方法。jsonb在这种情况下,PostgreSQL将在缓存中保留更多元组,因为不需要将整个jsonb数据保留在内存中。

无论如何,我最终在字段类型中使用了protobuf+组合(因为不需要在我们的系统中查询字段中的数据):zlibbyteabytea

Uber 对 protobuf + zlib 的研究


推荐阅读