Оптимизируйте аналитический запрос 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;
Если вы знаете, документ добавляется по крайней мере один раз в месяц.