Оптимизировать запрос с 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.


Ответы (0 шт):