【问题标题】:How to fetch data using indexing by jsonb data in postgresql如何在 postgresql 中使用 jsonb 数据的索引来获取数据
【发布时间】:2017-06-14 04:13:57
【问题描述】:

我正在使用 Postgresql 9.6, 在这里,我试图代表 jsonb 类型的 Json 键从表中获取数据, 数据看起来像

 [{"name": "gp1", "type": "A"}, {"name": "gp2", "type": "A"}, {"name": "gp2", "type": "A"}]

这里的modules是column_name,client_modules是表名。

我也在使用下面的查询创建索引

create index myindex on client_modules((modules->>'name'));

问题是当我尝试使用以下查询从表中获取数据时

SELECT modules FROM client_modules WHERE modules @>'[{"name":"gp1"}]' or modules @> '{"name":"gp1"}';

我能够检索所需的数据,但在这种情况下,我的 plpgsql 查询是在默认 seqscan 索引上运行的,

我也在执行脚本

set enable_indexscan = on;
 AND 
set enable_seqscan = off;

但是查询仍然没有在我的索引上运行,当我运行查询时它仍然在默认索引上运行。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    对于 PostgreSQL 表达式索引,索引条件和过滤条件必须完全匹配。你的不匹配。您的索引:

    modules->>'name'
    

    然后你搜索:

    modules @>'[{"name":"gp1"}]'
    

    虽然您知道并且我知道这两个搜索在功能上是等效的,但 PostgreSQL 查询规划器并不知道这一点。所以你有两个选择:

    1. 将您的查询更改为类似于 `WHERE modules->>name ='gp1'
    2. 在整个 JSONB 字段上创建通用 GIN 索引:CREATE INDEX jsonb_all ON client_modules USING GIN (modules);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2017-09-11
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      相关资源
      最近更新 更多