Оптимизируйте аналитический запрос Max() и DENSE_RANK для курсора

У меня есть запрос, который занимает много времени (187,42 секунды), чтобы найти все связанные документы, содержащие атрибут (c.scr), и из этого списка я получаю документ, обработанный с последней датой документа. Мне было интересно, если кто-нибудь может предоставить какие-либо предложения по оптимизации запроса.

Обратите внимание, я играл с ROW_NUMBER, RANK и DENSE_RANK, и они были еще медленнее, так что это лучшее, что я получил до сих пор.

       (Query) total time '187.42 seconds':

              SELECT MAX(A.DOC_NUM) KEEP (DENSE_RANK FIRST ORDER BY A.DOC_DT DESC) as DOC_NUM
              FROM AB A , CD C 
              WHERE A.ID = C.ID
              AND SUBSTR(C.SCR,20,8) = '123123123';


      (Data Set) : 

              DOC_NUM             DOC_DT
              AB201201230000058 JAN-23-12
              AB201206280000674 JUN-28-12
              AB201406230000066 AUG-05-14
              AB201406230000066 AUG-05-14
              AB201312170000227 DEC-17-13
              AB201312180000093 DEC-19-13

Спасибо,

1 ответ

Вы можете попробовать сделать это так:

SELECT A.*
FROM (SELECT A.DOC_NUM
      FROM AB A JOIN
           CD C 
           ON A.ID = C.ID
      WHERE SUBSTR(C.SCR, 20, 8) = '123123123'
      ORDER BY A.DOC_DT DESC
     ) A
WHERE rownum = 1;

Затем вы можете ускорить это различными способами. Индексы могут помочь (если их нет). Кроме того, поскольку вы ищете самый последний документ, тогда может помочь уменьшение результирующего набора:

SELECT A.*
FROM (SELECT A.DOC_NUM
      FROM AB A JOIN
           CD C 
           ON A.ID = C.ID
      WHERE SUBSTR(C.SCR, 20, 8) = '123123123' AND A.DOC_DT >= sysdate - 30
      ORDER BY A.DOC_DT DESC
     ) A
WHERE rownum = 1;

Если вы знаете, документ добавляется по крайней мере один раз в месяц.

Другие вопросы по тегам