[postgres] массив в jsonb
От: barboss  
Дата: 17.03.25 13:23
Оценка:
Имеется список массивов в json. Нужно найти записи , содержащие в массиве заданный элемент.
Пример:

CREATE TABLE  public.test_arr
(
    id serial,
    arr_ids jsonb
)
    
CREATE INDEX test_arr_index ON public.test_arr USING gin(arr_ids)

insert into public.test_arr(arr_ids) values('["a","b","c"]')
insert into public.test_arr(arr_ids) values('["a","d","m"]')
insert into public.test_arr(arr_ids) values('["c"]')

select * from (
select jsonb_array_elements(arr_ids) val , *
from test_arr
)t
where  val = '"c"'



На больших объемах ищет очень долго. Видимо селект неоптимальный и не подключается индекс.
Можно ли ускорить выборку?
Re: [postgres] массив в jsonb
От: bnk СССР http://unmanagedvisio.com/
Дата: 17.03.25 13:34
Оценка: 81 (2) +1
Здравствуйте, barboss, Вы писали:

B>На больших объемах ищет очень долго. Видимо селект неоптимальный и не подключается индекс.

B>Можно ли ускорить выборку?

GPT (кто тут говорил о его бесполезности)? Всем приготовиться собирать огурцы.

Да, можно ускорить поиск за счёт использования оператора JSONB‑контейнера @>. Он особенно эффективен с GIN‑индексом, созданным для jsonb‑поля.

Например, вместо обхода массива через функцию jsonb_array_elements, можно выполнить запрос так:

  SELECT *
  FROM test_arr
  WHERE arr_ids @> '["c"]'::jsonb;

Здесь проверяется, содержит ли jsonb‑массив элемент "c". GIN‑индекс, созданный на столбце arr_ids, будет использован, что существенно ускорит выборку на больших объёмах данных.

Отредактировано 17.03.2025 13:35 bnk . Предыдущая версия .
Re[2]: [postgres] массив в jsonb
От: barboss  
Дата: 17.03.25 14:37
Оценка:
bnk>  WHERE arr_ids @> '["c"]'::jsonb;

Круто! Мне он еще и про EXPLAIN ANALYZE накинул для информации
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.