2014-10-08 1 views
0

속성 (c.scr)을 포함하는 모든 관련 문서를 찾는데 오랜 시간이 걸리는 쿼리 (187.42 초)와 그 목록에서 문서를 제공하는 쿼리가 있습니다. 최신 문서 날짜로 처리됩니다. 누구든지 쿼리를 최적화하기위한 제안을 할 수 있는지 궁금합니다.커서에 대한 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의 느린 시간에 완료됩니다. 그 열이 색인되어 있는지 알지 못한다면 내가 더 빨리 만들 수 있는지 알 수있을 것입니다. –