Возможно, проблема в select distinct
. Это может быть трудно оптимизировать, потому что он удаляет дубликаты. Даже если ни одна строка не дублируется, Oracle по-прежнему работает. Если это не нужно, удалите его.
Для вашего конкретного запроса я написал бы его как:
WHERE A.LAST_LEG_FLAG = 'Y' AND
SCHLD_DATE >= DATAE '2019-04-01 AND
SCHLD_DATE <= DATE '2020-02-20' AND
A.MOVEMENT_TYPE = 'P' AND
EXCEPTIONAL_FLAG IN ('N', '5')
Форматы даты не влияют на производительность. Просто удобочитаемость и удобство обслуживания.
Для этого запроса оптимальный индекс, вероятно, равен: (LAST_LEG_FLAG, MOVEMENT_TYPE, SCHLD_DATE, EXCEPTIONAL_FLAG)
. Последние два столбца могут быть переключены, если EXCEPTIONAL_FLAG
более избирательно, чем SCHLD_DATE
.
Однако, если это возвращает много строк, тогда SELECT DISTINCT
будет стробирующим фактором для запроса. И это гораздо сложнее оптимизировать.