"Big" JSONB 列中的数据

"Big" data in a JSONB column

我有一个带有元数据列 (JSONB) 的 table。有时我 运行 查询此专栏。示例:

select * from "a" where metadata->'b'->'c' is not null

此列始终只有小 JSON 对象 <1KB。但是对于一些记录(小于0.5%),它可以>500KB,因为一些子属性有很多数据。

今天,我只有 ~1000 条记录,一切正常。但我想我很快就会有更多的记录,我不知道有一些大数据(当然我不是说 "Big Data"!)是否会对性能产生全局影响。 500KB "big" 用于 postgres,是否 "hard" 用于解析?也许我的问题太模糊了,如果需要我可以编辑。也就是说:

JSONB 列中有一些较大的条目 (<0.5%) 是否会显着影响 JSON 查询的全局性能?

旁注:假设 "big" 数据在 metadata->'c'->'d' 中,我不会 运行 对这个特定的 属性 有任何疑问。查询总是在 "small/common" 属性上完成。但是 "big" 属性仍然存在。

这是一个理论问题,所以我希望一个通用的答案会令人满意。
如果您需要数字,我建议您 运行 进行一些性能测试。生成一些大型 jsonb 对象进行测试应该不会太难。

只要数据是jsonb而不是json,像metadata->'b'->'c'这样的操作就会很快。你可能会浪费时间的地方是从 TOAST table 加载和解压缩一个大的 jsonb 值(“detoasted”)。

您可以通过在表达式上创建索引来避免该问题。然后索引扫描不必对 jsonb 进行 detoast,因此无论 jsonb 有多大,都会很快。 所以我认为只要能为查询建立索引就不会遇到性能问题。

您应该注意数据库的总大小。如果预期大小非常大,备份将成为一个挑战。它有助于设计和计划如何丢弃旧的和未使用的数据。这是在应用程序设计过程中经常被忽略的一个方面,往往会在多年后引起头痛。