【发布时间】:2018-03-31 10:23:28
【问题描述】:
我尝试搜索解决方案,但没有找到任何适合我的案例...
这是数据库声明(简化):
CREATE TABLE documents (
document_id int4 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
data_block jsonb NULL
);
这是一个插入的例子。
INSERT INTO documents (document_id, data_block)
VALUES(878979,
{"COMMONS": {"DATE": {"value": "2017-03-11"}},
"PAYABLE_INVOICE_LINES": [
{"AMOUNT": {"value": 52408.53}},
{"AMOUNT": {"value": 654.23}}
]});
INSERT INTO documents (document_id, data_block)
VALUES(977656,
{"COMMONS": {"DATE": {"value": "2018-03-11"}},
"PAYABLE_INVOICE_LINES": [
{"AMOUNT": {"value": 555.10}}
]});
我想搜索其中一个 PAYABLE_INVOICE_LINES 的行值大于 1000.00 的所有文档
我的查询是
select *
from documents d
cross join lateral jsonb_array_elements(d.data_block -> 'PAYABLE_INVOICE_LINES') as pil
where (pil->'AMOUNT'->>'value')::decimal >= 1000
但是,由于我想限制为 50 个文档,我必须对 document_id 进行分组并将结果限制为 50。
对于数百万个文档,这个查询非常昂贵...... 10 秒有 100 万个。
您有什么想法可以提高性能吗?
谢谢
【问题讨论】:
-
我目前被困在 PG 9.3 上,所以还没有那种数据类型,但我曾短暂地参与过一个 PG 9.6 项目,我们将数据 blob 存储在 jsonb 字段中,您可以创建该字段中的值的索引,性能相当不错。如果您必须保持结构不变,也许这就是您应该研究的内容。
标签: postgresql jsonb