Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Sql JSONB与Contains运算符连接_Sql_Postgresql_Indexing_Jsonb - Fatal编程技术网

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合作,是的,标识符周围的语法让我抓狂。