PostgreSQL不对“?”使用GIN索引JSON运算子

时间:2018-11-29 21:48:14

标签: postgresql indexing jsonb

由于某种原因索引未用于“?”运算符。

让我们来看看这个示例https://schinckel.net/2014/05/25/querying-json-in-postgres/

  CREATE TABLE json_test (
  id serial primary key,
  data jsonb
  );

  INSERT INTO json_test (data) VALUES 
  ('{}'),
  ('{"a": 1}'),
  ('{"a": 2, "b": ["c", "d"]}'),
  ('{"a": 1, "b": {"c": "d", "e": true}}'),
  ('{"b": 2}');

并创建一个索引。

create index json_test_index on public.json_test using gin (data jsonb_path_ops) tablespace pg_default;

然后查看以下查询的计划:

SELECT * FROM json_test WHERE data ? 'a';

会有Seq扫描,而我希望进行索引扫描。请问有人在这里出什么问题吗?

1 个答案:

答案 0 :(得分:1)

来自the docs:“非默认GIN运算符类jsonb_path_ops仅支持对@>运算符进行索引。”它不支持?运算符。

因此,请改用jsonb的默认运算符(如果您希望明确将其拼写,则称为“ jsonb_ops”)。

但是如果您的表只有5行,则除非您通过set enable_seqscan = off强制使用索引,否则它可能不会使用索引。