Sql JSONB与Contains运算符连接
我有两个表,Sql JSONB与Contains运算符连接,sql,postgresql,indexing,jsonb,Sql,Postgresql,Indexing,Jsonb,我有两个表,ClaimPaymentHistory和汇款历史,我目前正在加入以下查询 select rh."EventHistory" from "ClaimPaymentHistory" ph, jsonb_array_elements(ph."EventHistory") payments inner join "RemittanceHistory" rh on payments->> 'rk
ClaimPaymentHistory
和汇款历史
,我目前正在加入以下查询
select rh."EventHistory"
from "ClaimPaymentHistory" ph, jsonb_array_elements(ph."EventHistory") payments
inner join "RemittanceHistory" rh
on payments->> 'rk' = rh."RemittanceRefKey"::text
where ph."ClaimRefKey" = @ClaimRefKey
我想使用以下索引改进此查询:
CREATE INDEX claim_payment_history_gin_idx ON "ClaimPaymentHistory"
USING gin ("EventHistory" jsonb_path_ops)
但我似乎没有得到任何改善。但是,如果我使用@>
运算符查询该表的EventHistory列,我可以看到该索引被利用,例如:
select * from "ClaimPaymentHistory" where "EventHistory" @> '[{"rk": 637453920516771103}]';
所以我的问题是,我是否能够使用包含运算符创建联接?我一直在玩弄语法,但什么都没用
如果我无法使用该运算符创建联接,我最好的索引选项是什么?如果您这样编写查询,则可以使用该索引:
select rh."EventHistory"
from "RemittanceHistory" rh join "ClaimPaymentHistory" ph
on ph."EventHistory" @> jsonb_build_array(jsonb_build_object('rk',rh."RemittanceRefKey"))
where ph."ClaimRefKey" = 5;
然而,除非“汇款历史记录”中只有几行,否则它不可能有好的性能
…我最好的索引选项是什么
如果你还没有它们,最明显的选择是rh.“RemittanceRefKey”和ph.“ClaimRefKey”上的常规(btree)索引
另外,请查看(并向我们展示)原始查询的
EXPLAIN(ANALYZE,BUFFERS)
。我最后重构了表结构。我没有通过remitteancerefkey
进行连接,而是在remitteancehistory
中添加了一个名为ClaimRefKeys
的JSONB列。这只是一个整数值数组,现在我可以使用以下命令查找所需的行:
select "EventHistory" from "RemittanceHistory" where "ClaimRefKeys" @> @ClaimRefKey;
这与下面的索引相结合,提供了非常出色的性能
CREATE INDEX remittance_history_claimrefkeys_gin_idx ON "RemittanceHistory" USING gin ("ClaimRefKeys" jsonb_path_ops);
与您的问题无关,但是:您应该真正避免那些可怕的引用标识符。他们的麻烦远比他们值得的多。啊我不知道。这个项目是我第一次与postgres合作,是的,标识符周围的语法让我抓狂。