Стоимость поиска типов данных jsonb в postgres - PullRequest
0 голосов
/ 12 марта 2019

Это может быть очевидным и простым вопросом.

Но я прочитал jsonb тип данных документация , но нигде не упоминается стоимость поиска ключа в данных jsonb.

Например, допустим, у меня есть таблица со следующей схемой:

CREATE TABLE A (id character varying (20),
                info jsonb);

Я хочу знать, как postgres будет анализировать запрос where, как показано ниже:

SELECT * FROM A WHERE info->>'city' = 'portland';

Проходя через поле jsonb строки, является ли постоянное время поиска (O(1)) или линейным временем (проверка каждого ключа один за другим в словаре jsonb строки) в этом словаре данных jsonb?

MyИнтуиция заключается в том, что это должно быть постоянное время (иначе какой смысл в словарном стиле?), но я не вижу его в официальной документации, чтобы убедить мою команду.

Любая помощь будет отличной!

Спасибо!

1 Ответ

0 голосов
/ 12 марта 2019

Как и для любого условия WHERE в SQL: если индекса нет, база данных должна пройти по всем строкам таблицы, чтобы найти те, которые удовлетворяют вашему условию.

Вы можете индексировать определенное выражение или индексировать все значение json с помощью GIN index , который затем позволяет Postgres использовать индекс, если используется какой-либо из поддерживаемых операторов.

Если вы всегда проверяете город, вы можете создать обычный индекс B-Tree:

create index on a ( (info->>'city') );

Если вы не знаете, что будете искать, индекс GIN может быть лучшим выбором:

create index on a using gin (info);

Но вам нужно будет изменить свой запрос, чтобы использовать один из операторов, поддерживаемых индексом GIN, например, использование содержит оператор @>

select *
from a 
where info @> '{"city": "portland"}::jsonb;

Обратите внимание, что поиск по индексу не всегда является наиболее эффективным решением. Иногда быстрее просто пройти по всем строкам, иногда поиск по индексу выполняется быстрее.

Если вы хотите узнать больше об индексах в реляционной базе данных, просмотрите материал здесь: http://use -the-index-luke.com /

...