【发布时间】:2015-08-29 21:50:56
【问题描述】:
我有一个 json 数组,其中包含大约 1000 个结构元素“oid:aaa, instance:bbb, value:ccc”。
{"_id": 37637070
, "data": [{"oid": "11.5.15.1.4", "value": "1", "instance": "1.1.4"}
, {"oid": "11.5.15.1.9", "value": "17", "instance": "1.1.4"}
, {"oid": "12.5.15.1.5", "value": "0.0.0.0", "instance": "0"}]}
oid 和 instance 在每个 json 数组中都是唯一的。如果我可以选择更改结构,我会将格式更改为 key:value:
{"11.5.15.1.4-1.1.4":"1", "11.5.15.1.9-1.1.4": "17", "12.5.15.1.5-0": "0.0.0.0"}
但是,如果我需要保留旧结构
从数组中获取特定
oid的最快方法是什么?获取包含
oid、instance和value3 列的表的最快方法是什么。或者甚至更好的是使用 oid+instance 作为列标题的数据透视表。
对于 2。我尝试了以下方法,但在大桌子上速度很慢:
select *
from (
select a->>'oid' oid, a->>'instance' instance, a->>'value' value1, id
from (
select jsonb_array_elements(config#>'{data}') a, id
from configuration
) b
) c
where oid = '1.3.6.1.4.1.7352.3.10.2.5.35.3' and instance = '0' and value1 <> '1';
【问题讨论】:
-
您的查询可以像
select a->>'oid' oid, a->>'instance' instance, a->>'value' value1, id from ( select jsonb_array_elements(config#>'{data}') a, id from configuration ) b where a->>'instance' = '1.1.4' and a->>'oid' = '11.5.15.1.4' and a->>'value'<>'2';一样简单得多,但 PostgreSQL 将您的查询和此查询优化为同一事物。 -
虽然如果在最里面的查询中您还使用
config@>'{"data":[{"oid":"11.5.15.1.4","instance":"0"}]}'限制了结果行,它可能会更快,但不需要从jsonb_array_elements中检查那么多行。跨度> -
你的表的定义应该在问题中。在 psql 中使用
\d configuration会得到什么。或有效的CREATE TABLE脚本。
标签: sql json postgresql indexing jsonb