在 PostgreSQL 中存储未使用的数据块的最有效方法
Most efficient way to store unused chunk of data in PostgreSQL
table 中的列数很少,基于数据的列数约为 100 多列,只需要存储以供以后导出到其他来源。
此数据(除了提到的前几列之外)不需要编制索引/过滤或以某种方式进行操作。没有可以任何方式检查此数据的查询。
唯一的问题是,应用层可以检索具有额外未使用工作负载的整行并将其反序列化以进一步转换为外部格式。
有一个想法将整个 class 序列化到这个字段中,但后来我们意识到,这对数据大小来说是一个巨大的开销(因为额外的 java class 元数据) .
所以这是一个简单的键值数据(键集是静态的,正如关系模型所建议的那样)。
就数据库性能(50+ TB 存储)而言,在 PostgreSQL 中存储这些额外未使用数据的正确方法和数据类型是什么?也许值得省略键数据并仅将值存储为数组(因为键是静态的)并在应用程序层通过索引反序列化后获取值(因为首先是数据库性能)?
a_horse_with_no_name,非常感谢,但是 jsonb
确实是一个棘手的数据类型。
就包含 jsonb
的单个元组所需的字节数而言,必须始终牢记 - key
名称的大小 json
格式。
这样,如果有人想重新发明轮子并将大 key
名称存储为单个 byte
索引 - 这将减少整体元组大小,
但它并不比将所有数据存储为典型的关系 table 字段更好,因为 TOAST
算法适用于这两种情况。
另一种方法是对单个jsonb
字段使用EXTERNAL
存储方法。
在那种情况下 PostgreSQL
将在缓存中保留更多元组,因为不需要将整个 jsonb
数据保留在内存中。
无论如何,我最终在 bytea
字段类型中使用了 protobuf
+ zlib
的组合(因为在我们的 bytea
字段中不需要查询数据系统):
table 中的列数很少,基于数据的列数约为 100 多列,只需要存储以供以后导出到其他来源。
此数据(除了提到的前几列之外)不需要编制索引/过滤或以某种方式进行操作。没有可以任何方式检查此数据的查询。
唯一的问题是,应用层可以检索具有额外未使用工作负载的整行并将其反序列化以进一步转换为外部格式。
有一个想法将整个 class 序列化到这个字段中,但后来我们意识到,这对数据大小来说是一个巨大的开销(因为额外的 java class 元数据) . 所以这是一个简单的键值数据(键集是静态的,正如关系模型所建议的那样)。
就数据库性能(50+ TB 存储)而言,在 PostgreSQL 中存储这些额外未使用数据的正确方法和数据类型是什么?也许值得省略键数据并仅将值存储为数组(因为键是静态的)并在应用程序层通过索引反序列化后获取值(因为首先是数据库性能)?
a_horse_with_no_name,非常感谢,但是 jsonb
确实是一个棘手的数据类型。
就包含 jsonb
的单个元组所需的字节数而言,必须始终牢记 - key
名称的大小 json
格式。
这样,如果有人想重新发明轮子并将大 key
名称存储为单个 byte
索引 - 这将减少整体元组大小,
但它并不比将所有数据存储为典型的关系 table 字段更好,因为 TOAST
算法适用于这两种情况。
另一种方法是对单个jsonb
字段使用EXTERNAL
存储方法。
在那种情况下 PostgreSQL
将在缓存中保留更多元组,因为不需要将整个 jsonb
数据保留在内存中。
无论如何,我最终在 bytea
字段类型中使用了 protobuf
+ zlib
的组合(因为在我们的 bytea
字段中不需要查询数据系统):