【问题标题】:JSONB Joining with the Contains OperatorJSONB 使用包含运算符连接
【发布时间】:2021-01-04 23:03:37
【问题描述】:

我有两个表,ClaimPaymentHistoryRemittanceHistory,我目前正在加入以下查询。

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}]';

所以我的问题是,我可以使用包含运算符创建连接吗?我一直在玩语法,但什么都做不了。

如果我无法使用该运算符创建连接,我最好的索引选择是什么?

【问题讨论】:

  • 与您的问题无关,但是:您应该真正避免使用那些可怕的带引号的标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…
  • 啊,我不知道。这个项目是我第一次使用 postgres,是的,标识符周围的语法让我发疯。

标签: sql postgresql indexing jsonb


【解决方案1】:

如果您这样编写查询,则可以使用该索引:

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;

但是,除非“RemittanceHistory”中的行数很少,否则这不太可能有良好的性能。

...我最好的索引选择是什么?

如果您还没有它们,显而易见的选择是 rh."RemittanceRefKey" 和 ph."ClaimRefKey" 上的常规(btree)索引。

另外,查看(并向我们展示)EXPLAIN (ANALYZE, BUFFERS) 以获取您想要加快速度的原始查询。

【讨论】:

    【解决方案2】:

    我最终重构了表结构。我没有通过RemittanceRefKey 连接,而是向RemittanceHistory 添加了一个名为ClaimRefKeys 的JSONB 列。这只是一个整数值数组,现在我可以使用以下命令查找所需的行:

    select "EventHistory" from "RemittanceHistory" where "ClaimRefKeys" @> @ClaimRefKey;
    

    这与以下索引相结合提供了非常出色的性能。

    CREATE INDEX remittance_history_claimrefkeys_gin_idx ON "RemittanceHistory" USING gin ("ClaimRefKeys" jsonb_path_ops);
    

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2016-03-01
      • 2013-12-28
      • 2011-10-24
      相关资源
      最近更新 更多