Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql JSONB数组元素索引_Postgresql_Indexing_Jsonb - Fatal编程技术网

Postgresql JSONB数组元素索引

Postgresql JSONB数组元素索引,postgresql,indexing,jsonb,Postgresql,Indexing,Jsonb,我们在Postgres 11中有表格: _order ----------- id items: jsonb: [{'id': 1},{'id': 5}...] property ----------- item_id value 我们需要为每个订单获取带有项目数组的订单列表,其中设置了property.value 我使用这样的查询: 选择 _订单。*, jsonb_agg(distinct property.value)过滤器(其中property.value不为null)作为列出的_

我们在Postgres 11中有表格:

_order
-----------
id

items: jsonb: [{'id': 1},{'id': 5}...]

property
-----------
item_id

value
我们需要为每个订单获取带有项目数组的订单列表,其中设置了
property.value

我使用这样的查询:

选择
_订单。*,
jsonb_agg(distinct property.value)过滤器(其中property.value不为null)作为列出的_项
从订单
左连接jsonb_数组_元素(项)jae on true
((jae->'id')::int=property.id)上的左连接属性
分组依据_order.id
_order.id、property.item\u id-主键
对于实际数据(8k订单,每个500个项目,总计约为4mil行),查询速度太慢,约为25秒

在订单项上添加GIN索引后,查询开始工作15秒,但速度仍然很慢

问题:如何从jsonb为数组
id
构建索引?我发现了如何使用这个简单的键值,而不是数组


也许您知道如何优化货币数据库模式的查询吗?

没有支持
jsonb\u array\u elements()
的索引。这个模型设计得很差。您需要通过创建一个新表来规范化它,该表包含作为行的数组元素。我同意klin的观点:这是您为反规范化所付出的代价。如果您无法规范化数据,那么您可以从数组中删除冗余id并只存储一个普通列表吗?因此,
[1,5]
而不是
[{'id':1},{'id':5}]
,这将允许一个更简单的连接,而不需要为您的答案提供不必要的测试库!我不能像[1,5]那样使用数组,因为我在json中存储了一些项目字段,比如“价格”。索引有什么用?您的“左联接”意味着您将返回整个表。没有任何索引可以支持
jsonb\u array\u elements()
。这个模型设计得很差。您需要通过创建一个新表来规范化它,该表包含作为行的数组元素。我同意klin的观点:这是您为反规范化所付出的代价。如果您无法规范化数据,那么您可以从数组中删除冗余id并只存储一个普通列表吗?因此,
[1,5]
而不是
[{'id':1},{'id':5}]
,这将允许一个更简单的连接,而不需要为您的答案提供不必要的测试库!我不能像[1,5]那样使用数组,因为我在json中存储了一些项目字段,比如“价格”。索引有什么用?你的“左连接”意味着你无论如何都要返回整个表。