2014-10-08 5 views
0

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

Обратите внимание, что я играл с 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 
       AB2012JAN-23-12 
       AB201206280000674 JUN-28-12 
       AB201406230000066 AUG-05-14 
       AB201406230000066 AUG-05-14 
       AB201312170000227 DEC-17-13 
       AB201312180000093 DEC-19-13 

Спасибо,

+2

Самая большая вещь, которая выскакивает для меня, - это предложение 'Where':' SUBSTR (C.SCR, 20,8) = '123123123'' не может использовать какой-либо индекс (если у вас есть) с этим утверждением. – Siyual

+0

Уверен, что он может ... функционально-основанный. Вопрос в том, является ли такой индекс полезным (LIO-wise). – nop77svk

ответ

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; 

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

+0

Так что выполнение этого запроса действительно было выполнено в более медленное время 199.52. Я подозреваю, что не знать, проиндексирован ли этот столбец, будет ответ, чтобы узнать, могу ли я сделать это быстрее. –