Вы не можете индексировать результаты функции возврата набора (кроме создания материализованного представления).
Мы можем рассуждать, что если a.accounts @> '{"role": "ADVISOR"}'
, то необходимо t.accounts @> '[{"role": "ADVISOR"}]'
. PostgreSQL не может этого объяснить, но мы можем.
Однако это также не поможет, потому что вы делаете левые соединения. Если возвращается каждая строка t1, чего ожидать от индекса sh?
С добавленным предложением WHERE вы можете использовать JSONPATH (если вы используете последнюю версию PostgreSQL ), чтобы получить строки t1, которые вы, кажется, хотите. Он будет использовать индекс для t1 (stocks)
, с или без jsonb_path_ops
:
WHERE (s.stocks -> 'value' ? 'XXX') AND
t.stocks @? '$[*] ? (@.type == "RIC" ) ? (exists (@.value.XXX))';
Однако индекс не очень эффективен, если почти все записи имеют тип RI C, поэтому это пирри c победа.