Индекс по JSONB есть, но запрос применяет другое выражение
Индекс по JSONB есть, но запрос применяет другое выражение Индекс: CREATE INDEX events_payload_gin ON events USING gin (payload); Фильтр: WHERE payload->>'status' = 'paid' План: Seq Scan Filter: ((payload ->> 'status') = 'paid') GIN создан на колонке payload. Но ->> извлекает из неё текст, и запрос сравнивает уже результат выражения. Обычный GIN на всей колонке не становится автоматически индексом для такого равенства. Другая форма: WHERE payload @> '{"status": "paid"}'::jsonb применяет containment-оператор к самой jsonb-колонке и может соответствовать GIN-индексу. Для часто используемого выражения: payload->>'status' может рассматриваться отдельный B-tree expression index. Перед изменением проверьте: — семантику двух условий; — типы значений внутри JSON; — отсутствующий ключ и JSON null; — долю подходящих строк; — частоту запроса; — стоимость обновления индекса; — Filter, Index Cond и Recheck Cond в плане. Seq Scan не всегда ошибка: при небольшой таблице или большом числе подходящих строк он может быть дешевле индекса. Вывод: проверяйте не только наличие индекса, но и совпадение оператора и выражения запроса с тем, что реально индексируется. Сохраните пример для случаев, когда «индекс есть», но план всё равно показывает Seq Scan. #УЦФОРС #PostgreSQL #JSONB #Индексы #Backend