从JSONB字段对象中选择键时,Postgresql查询速度非常慢

从JSONB字段对象中选择键时,Postgresql查询速度非常慢,postgresql,jsonb,Postgresql,Jsonb,当包含mybodyJSONB字段中存储的对象的密钥时,查询的运行速度比选择字段中没有该字段时慢约100毫秒: SELECT id, title, body->'_stats' AS stats FROM items 这大约需要105毫秒,而不包括statsselect时只需要5毫秒。从JSONBbody对象返回哪个键似乎无关紧要,它们都会显著降低查询速度。我想在这个查询中包含body对象中的其他键,但是我添加的每一个键都会将整个查询时间增加约50毫秒 b

当包含my
body
JSONB字段中存储的对象的密钥时,查询的运行速度比选择字段中没有该字段时慢约100毫秒:

SELECT id, 
       title,
       body->'_stats' AS stats
  FROM items
这大约需要105毫秒,而不包括
stats
select时只需要5毫秒。从JSONB
body
对象返回哪个键似乎无关紧要,它们都会显著降低查询速度。我想在这个查询中包含body对象中的其他键,但是我添加的每一个键都会将整个查询时间增加约50毫秒

body
字段有一个gin索引,我在第9.5x页和第9.6.1页中都看到了这种行为

关于更有效地返回jsonb对象数据的替代方法,有什么建议吗?

阅读(我的重点):

JSON是一种文本格式,有助于所有编程语言之间的结构化数据交换

简而言之,JSON适合于向应用程序的其他组件发送信息或从中接收信息,但它通常不是数据库固有的格式,对关系数据模型来说完全是陌生的,因此无论您希望如何处理它,它都不是特别快


如果您只是简单地存储和检索完整的JSON文档,那么就没有问题了,但是一旦您开始在DBMS中操作JSON文档,并且速度是一个问题,那么您就应该将您的
JSON
数据正常化。

很抱歉,但是一个高人一等的回答对任何人都没有帮助。。。我有很好的理由使用jsonb字段来存储非结构化数据——这不是问题的原因。查询速度惊人地慢可能是因为查询引擎必须在提取特定键之前加载整个body字段。完整查询的物化视图可能是一种解决方法,我很快就会尝试。我理解你的沮丧,但答案根本不是为了讨好你。您希望在针对解构数据进行优化的环境中分析结构化数据(标准中的另一个术语)。JSON是纯1NF,而现代DBMS在3NF数据模型上运行效率最高。这种区别是很多程序员忽略的,所以我认为指出它是有价值的。