postgresql 是否可以在postgres jsonb列中的列表上创建索引

q35jwt9p  于 2023-03-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(151)

我有一个postgres表,它有一个jsonb列,其中包含了我们要查询的列表。

{"org": 3, "subscriberCodes": ["A555", "A666"]}

我希望能够查询表搜索的订户代码。
我知道我可以做一个类似的查询:

SELECT *
FROM permissions.application_settings
WHERE configuration->>'subscriberCodes' LIKE '%A555%'

但这有几个问题,我必须对每个订阅者代码触发一个查询(我试图弄清楚如何执行WHERE IN子句,但不太明白),并且它最终会对整个表进行顺序扫描(这对我们拥有的记录数量来说不是很好)。
我对jsonb还不是很熟悉,有没有一种方法可以使用WHERE IN子句,并在订阅者代码数组上创建索引,这样就不需要顺序扫描了?

brgchamk

brgchamk1#

最好知道你打算如何查询列which functions and operators,你将使用什么下标,这有助于选择一个合适的索引。你可以从索引整个内容开始,以便使用jsonpathdemo

create index on permissions.application_settings using gin (jsonb_path_ops);

select * from permissions.application_settings
where configuration @? '$.subscriberCodes[*]?(@=="A555")';

expression/functional index可以将索引限制为下标:

create index on permissions.application_settings 
  using gin ((configuration->'subscriberCodes') jsonb_path_ops);

select * from permissions.application_settings
where configuration->'subscriberCodes' @? '$[*]?(@=="A555")';

您也可以坚持使用非jsonpath方法:

create index on permissions.application_settings 
  using gin ((configuration->'subscriberCodes') jsonb_ops);

select * from permissions.application_settings
where configuration->'subscriberCodes' ? 'A555';

相关问题