Postgresql не использует индекс GIN для "?"Оператор JSON - PullRequest
0 голосов
/ 30 ноября 2018

По какой-то причине индекс не используется для "?"оператор.

Давайте возьмем этот пример 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 Scan, в то время как я ожидаю сканирования индекса.Может, кто-нибудь посоветует, что здесь не так?

1 Ответ

0 голосов
/ 30 ноября 2018

С в документах : «Класс операторов GIN не по умолчанию jsonb_path_ops поддерживает индексирование только оператора @>."Он не поддерживает оператор ?.

Так что вместо этого используйте оператор jsonb по умолчанию (называемый "jsonb_ops", если вы хотите явно его указать).

Но если вашТаблица содержит только 5 строк, вероятно, она все равно не будет использовать индекс, если вы не принудительно зададите значение set enable_seqscan = off.

...