Индекс GIN для столбца jsonb будет поддерживать несколько операторов JSON . Одним из них является оператор @>
, который также работает с массивами JSON.
Следующий индекс:
create index on product_list using gin (product_ids);
Запрос, который может потенциально использовать вышеуказанный индекс, будет выглядеть следующим образом:
select *
from product_list
where product_ids @> '[{"productId": 42}]'::jsonb;
Ваш предложенный вид не может использовать индекс, поскольку столбец JSONB не является частью вида, и это необходимо для того, чтобы можно было выполнить условиестолбец JSON.
Единственный способ использовать индекс в представлении - включить в него столбец JSON:
create view normalized_list
as
SELECT pl.id AS list_id,
t.product_id,
pl.product_ids
FROM product_list pl
CROSS JOIN jsonb_array_elements(pl.product_ids) ->> 'id' AS t(product_id)
;
Запрос, подобный следующему:
select id, product_Id
from normalized_list
where product_ids @> '[{"id":42}]'::jsonb;
будет использовать индекс GIN.
Обратите внимание, что если вы только хотите хранить идентификаторы денормализованным образом, собственный целочисленный массив (product_ids int[]
) будет более эффективным и сделает таблицу существенно меньше