Как оптимизировать следующий SQL Query? - PullRequest
0 голосов
/ 21 февраля 2020

Запрос равен

SELECT DISTINCT A.X1, A.X2, A.X3, TO_DATE(A.EVNT_SCHED_DATE,'DD-Mon-YYYY') AS EVNT_SCHED_DATE,
               A.X4, A.MOVEMENT_TYPE, TRIM(A.EFFECTIVE_STATUS) AS STATUS, A.STATUS_TIME, A.TYPE, 
               A.LEG_NUMBER,
               CASE WHEN A.EFFECTIVE_STATUS='BT' THEN 'NLT'
                    WHEN A.EFFECTIVE_STATUS='NLT' THEN 'NLT'
                    WHEN A.EFFECTIVE_STATUS='MKUP' THEN 'MKUP'
               END  AS STATUS
FROM PHASE1.DY_STATUS_ZONE A
WHERE A.LAST_LEG_FLAG='Y'
                   AND SCHLD_DATE>='01-Apr-2019'--TO_DATE(''||MNTH_DATE||'','DD-Mon-YYYY') 
                AND SCHLD_DATE<='20-Feb-2020'--TO_DATE(''||TILL_DATE||'','DD-Mon-YYYY') 
                AND A.MOVEMENT_TYPE  IN ('P')
                AND (EXCEPTIONAL_FLAG='N' OR EXCEPTION_TYPE='5') ---------SS

PHASE1.DY_STATUS_ZONE содержит 710246 записей. Пожалуйста, укажите, можно ли оптимизировать этот запрос?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Возможно, проблема в 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 будет стробирующим фактором для запроса. И это гораздо сложнее оптимизировать.

0 голосов
/ 21 февраля 2020

Вы можете попробовать добавить индекс, охватывающий условие WHERE:

CREATE INDEX idx ON PHASE1.DY_STATUS_ZONE (LAST_LEG_FLAG, SCHLD_DATE, MOVEMENT_TYPE,
    EXCEPTIONAL_FLAG, EXCEPTION_TYPE);

В зависимости от количества ваших данных, указанный выше индекс может использоваться или не использоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...