Указанный вами индекс не может дать первый план, который вы нам показываете. С этим индексом план должен будет применить фильтр для столбца jsonb, а это не так. Таким образом, индекс должен быть частичным, с фильтром, применяемым на уровне индекса, чтобы он не требовался в плане.
PostgreSQL равен , используя индекс для максимального значения запрос, это просто не тот индекс, который вам нужен.
Все ваши devide_id = 7 должны иметь низкие метки времени, но PostgreSQL не знает этого. Он думает, что, пройдя по индексу меток времени, он быстро найдет device_id = 7, а затем будет готово. Но вместо этого ему нужно пройти большой кусок индекса, прежде чем найти такую строку.
Вы можете принудительно удалить его из «неправильного» индекса, изменив агрегатное выражение на что-то вроде:
MAX(time_stamp + interval '0')
Или вместо этого вы можете создать более специализированный индекс, который планировщик выберет вместо ложно привлекательного:
create index on device.status_events (device_id , time_stamp)
where status->'1.3.6.1.4.1.34094.1.1.1.1.1' != '{}';