Запрос выглядит нормально. Все, что вы можете сделать, это предоставить соответствующий индекс. Это будет индекс по столбцам в предложении WHERE
как минимум. Начните с самого ограничительного столбца. Таким образом,
- сколько строк соответствует
active = 1
?
- сколько строк соответствует
deletedOn IS NULL
?
- сколько строк соответствует
updatedOn <= timestamp '2019-03-25 21:00:00'
?
Выберите тот, который получает наименьшее количество строк. Скажите, что это active
, затем updatedOn
, затем deletedOn
. Это дает вам:
create index idx on audit_frame_master(active, updatedOn, deletedOn);
Поскольку вы хотите сгруппировать по frame_id
, а затем найти максимум id
, вы можете добавить их в следующем порядке:
create index idx on audit_frame_master(active, updatedOn, deletedOn, frame_id, id);
Это индекс покрытия. Если СУБД использует его, ей даже не нужно обращаться к таблице.
СУБД может использовать или не использовать этот индекс. Это просто предложение. Если СУБД считает, что будет слишком много работы для просмотра индекса, а не просто для последовательного чтения таблицы, она не будет ее использовать. Просто попробуй.