【问题标题】:Index created for PostgreSQL jsonb column not utilized未使用为 PostgreSQL jsonb 列创建的索引
【发布时间】:2020-08-20 11:11:03
【问题描述】:

我已经为 jsonb 列中的字段创建了一个索引:

create index on Employee using gin ((properties -> 'hobbies'))

生成的查询是:

CREATE INDEX employee_expr_idx ON public.employee USING gin (((properties -> 'hobbies'::text)))

我的搜索查询结构如下:

SELECT * FROM Employee e
    WHERE e.properties @> '{"hobbies": ["trekking"]}'
    AND e.department = 'Finance'
    

为此查询运行 EXPLAIN 命令给出:

Seq Scan on employee e  (cost=0.00..4452.94 rows=6 width=1183)
    Filter: ((properties @> '{"hobbies": ["trekking"]}'::jsonb) AND (department = 'Finance'::text))

这样,我不确定索引是否被用于搜索。

整个设置都可以吗?

【问题讨论】:

    标签: postgresql indexing jsonb


    【解决方案1】:

    您在 WHERE 子句中使用的表达式必须与索引中的表达式完全匹配,您的索引使用表达式:((properties -> 'hobbies'::text)),但您的查询仅使用左侧的e.properties

    要使用该索引,您的 WHERE 子句需要使用与索引中相同的表达式:

    SELECT * 
    FROM Employee e
    WHERE (properties -> 'hobbies') @> '["trekking"]'
      AND e.department = 'Finance'
    

    但是:您的执行计划显示表employee 非常小(行数=6)。对于这么小的表,Seq Scan 始终是检索数据的最快方法,无论您定义哪种索引。

    【讨论】:

    • 如何将它与spring数据查询一起使用。所以输入将是爱好。如果我尝试将本机查询编写为:@Query(value = "SELECT * FROM Employee e" + "WHERE (e.properties -> 'hobbies') @> :hobby AND e.department = 'Finance'", nativeQuery =真的)爱好被框定为说,[“徒步旅行”]。它拒绝识别@>。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多