Оптимизировать запрос с jsonb в postgresql
WITH stage_settings AS (SELECT
rs.id AS selection_id,
stage.id AS stage_id,
stage.stageType
FROM selection rs,
jsonb_to_recordset(lower(rs.stage_settings) :: JSONB) AS stage(id INT, stageType INT))
SELECT * from request r
where r.current_stage_id in (select stage.stage_id from stage_settings stage
and r.selection_id = stage.selection_id and stage.stageType in (:stageTypeIds))
Есть таблица заявки request, каждая заявка относится к отбору selection, в настройках отбора есть поле json (varchar) настройки стадий stage_settings. Каждая стадия относится к какому-либо типу стадии stage_type. Заявки могут относится к разным отборам, но могут находиться в одинаковом типе стадии. То есть заявка переходит в зависимости от настроек по порядку от стадии к стадии. Задача - собрать запрос с фильтром по текущему типу стадии. Заявок в базе много, отборов тоже много. Надо как то оптимизировать запрос. Конечный результат запроса выдает на клиент не больше 1000 строк.
Пример json для настройки стадии (полей больше, оставлены только необходимые):
[{"id": 1, "stageType": 1}, {"id": 2, "stageType": 3}]
Как лучше оптимизировать запрос? Возможно стоит уйти от СТЕ подзапроса, или добавить индексы. На данный момент stage_settings типа VARCHAR. Теоретически, можно перевести в jsonb, только тогда jsonb_to_recordset не посчитает stageType, т.к. не понимает camelCase.