Oracle группировка и ИЛИ запрос оптимизации - PullRequest
0 голосов
/ 13 марта 2020
SELECT BATCH_ID,
  BU_CODE,
  BU_TYPE,
  BATCH_TYPE,
  BATCH_GROUP_ID,
  STATUS,
  UPD_DTIME
FROM BATCH_T
WHERE (BU_CODE, BU_TYPE, BATCH_TYPE, UPD_DTIME) IN
  (SELECT BU_CODE,
    BU_TYPE,
    BATCH_TYPE,
    MAX(UPD_DTIME)
  FROM BATCH_T
  WHERE STATUS = 'CLOSED'
  GROUP BY BU_CODE,
    BU_TYPE,
    BATCH_TYPE
  )
OR UPD_DTIME >= SYSDATE - 5;

Как и выше Oracle Запрос без условия ИЛИ дает быстрый ответ, но при условии ИЛИ это занимает так много времени. Не могли бы вы помочь, как улучшить время ответа на запрос выше.

Ответы [ 3 ]

2 голосов
/ 13 марта 2020

Вы хотите последнюю закрытую запись и все за последние пять дней. Используйте оконные функции!

SELECT b.*
FROM (SELECT b.*,
             ROW_NUMBER() OVER (PARTITION BY BU_CODE, BU_TYPE, BATCH_TYPE, STATUS ORDER BY UPD_DTIME DESC) as seqnum
      FROM BATCH_T b
     ) b
WHERE UPD_DTIME >= SYSDATE - 5 OR
      (STATUS = 'CLOSED' AND seqnum = 1);

Это должно быть быстрее, чем любой метод, использующий IN / EXISTS и агрегирование. Также проще написать.

1 голос
/ 13 марта 2020

Разделите запрос таким образом, чтобы в нем было условие AND, чтобы получить прирост производительности, как показано ниже.

 SELECT BATCH_ID,
  BU_CODE,
  BU_TYPE,
  BATCH_TYPE,
  BATCH_GROUP_ID,
  STATUS,
  UPD_DTIME
FROM BATCH_T
WHERE UPD_DTIME >= SYSDATE - 5

UNION ALL

SELECT BATCH_ID,
  BU_CODE,
  BU_TYPE,
  BATCH_TYPE,
  BATCH_GROUP_ID,
  STATUS,
  UPD_DTIME
FROM BATCH_T
WHERE (BU_CODE, BU_TYPE, BATCH_TYPE, UPD_DTIME) IN
  (SELECT BU_CODE,
    BU_TYPE,
    BATCH_TYPE,
    MAX(UPD_DTIME)
  FROM BATCH_T
  WHERE STATUS = 'CLOSED'
  GROUP BY BU_CODE,
    BU_TYPE,
    BATCH_TYPE
  ) AND NOT UPD_DTIME >= SYSDATE - 5;
0 голосов
/ 13 марта 2020

Вы можете создать индекс для UPD_DTIME

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