Индексирование элементов массива PostgreSQL JSONB

117
13

Как сказано в заголовке, как я могу индексировать массив JSONB?

Содержание выглядит как...

["some_value", "another_value"]

Я могу легко получить доступ к элементам, как...

SELECT * FROM table WHERE data->>0 = 'some_value';

Я создал индекс, как так...

CREATE INDEX table_data_idx ON table USING gin ((data) jsonb_path_ops);

Когда я запускаю EXPLAIN, я все еще вижу, что он последовательно сканирует...

Чего мне не хватает при индексации массива текстовых элементов?

спросил(а) 2021-01-25T14:32:58+03:00 4 месяца, 2 недели назад
1
Решение
108

В итоге я выбрал другой подход. У меня все еще есть проблемы с поиском, чтобы работать с использованием JSONB Type, поэтому я в итоге переключил свой столбец на varchar ARRAY

CREATE TABLE table (
data varchar ARRAY NOT NULL
);

CREATE INDEX table_data_idx ON table USING GIN (data);

SELECT * FROM table WHERE data @> '{some_value}';

Это работает и использует индекс.

Я думаю, что моя проблема с моим подходом JSONB заключается в том, что элемент на самом деле вложен гораздо дальше и рассматривается как текст.

то есть data->'some_key'->>'array_key'->>0

И каждый раз, когда я пытаюсь найти, я получаю всевозможные ошибки недопустимого токена и тому подобное.

ответил(а) 2021-01-25T14:32:58+03:00 4 месяца, 2 недели назад
45

Если вы хотите поддержать этот точный запрос с помощью индекса, индекс должен выглядеть следующим образом:

CREATE INDEX ON "table" ((data->>0));

Если вы хотите использовать имеющийся у вас индекс, вы не можете ограничить поиск только конкретным элементом массива (в вашем случае первым). Вы можете ускорить поиск some_value любом месте массива:

SELECT * FROM "table"
WHERE data @> '["some_value"]'::jsonb;

ответил(а) 2021-01-25T14:32:58+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема