2012-07-19 3 views
2

성능 문제를 생성하는 상관 하위 쿼리가 있습니다. 상관 된 부속 조회이므로 색인 힌트를 허용하지 않습니다. 그래서 대신 JOIN으로 변환하려고합니다. 아래에서 원래 쿼리와 수정 된 쿼리를 찾으십시오. 수정 된 쿼리는 행을 반환하지 않지만 원래 224 행을 반환합니다.상관 하위 쿼리를 JOIN으로 변환

이 경우 하위 쿼리 대신 JOIN을 사용하는 것이 합리적이라면 JOIN 쿼리의 문제점에 대한 통찰력을 높이십시오. 감사.

select Area_CODE, 
     due_DATE, 
     RATE, 

from SCHED S 
where (s.Area_CODE = 11001 and 
    (s.COMP_CODE = 'a' 
    or 
     (s.COMPANY_CODE = 'b' 
      and s.due_DATE < 
      (
      select 
       nvl(min(s1.due_DATE), to_date ('31-DEC-2999', 'DD-MM-YYYY')) 
       from SCHED s1 
       where s1.AREA_CODE = s.AREA_CODE 
       and s1.COMP_CODE = 'c' 
     ) 
     ) 
    ) 
    ) 
order by a.EFF_DATE asc, s.due_DATE asc 

수정 된 쿼리

SELECT 
    Area_CODE, 
     due_DATE, 
     RATE 

from SCHED S 
LEFT JOIN 
    (
    SELECT 
     NVL(MIN(s1.due_DATE), to_date ('31-DEC-2999', 'DD-MM-YYYY')) AS 
     min_date, 
     s1.AREA_CODE AS a_code 
    FROM 
     SCHED s1 
    WHERE 
     s1.COMPANY_CODE = 'c' 
    GROUP BY 
     s1.AREA_code 
) 
    s2 
ON 
    s2.A_CODE = s.area_code 
WHERE 
    (
    s.area_code = 11001 
    AND 
    (
     s.COMP_CODE = 'a' 
    OR 
     (
     s.COMP_CODE = 'b' 
     and s.due_DATE < s2.min_date 
    ) 
    ) 
) 
order by s.EFF_DATE asc, s.due_DATE asc 
+0

당신의 조인 코드는 괜찮지 만 서브 쿼리 코드에는 오류가 있다고 생각합니다 :'whe 다시 s1.AREA_CODE = s1.AREA_CODE'. –

+0

내 잘못입니다. 수정하여 수정했습니다. – dotnetFAQ

답변

0

주어진 지역 코드 왼쪽 조인

변경 (S2)에 대한 날짜

조인 내부에 없다 여기서 차이점은
inner JOIN 
( 
    SELECT 
     min(s1.due_DATE) AS min_date, 
     s1.AREA_CODE AS a_code 
    FROM 
     (
      select Area_Code, due_date from SCHED WHERE COMPANY_CODE = 'c' 
      union 
      select Area_Code, to_date('31-dec-2999','DD-MM-YYYY') from SCHED 
     ) s1  
    GROUP BY 
     s1.AREA_code 
) s2 
+0

Podiluska, 답장을 보내 주셔서 감사합니다. 변경 사항과 함께 작동하지만 초기 쿼리보다 비용이 많이 듭니다. 성능을 향상시키는 다른 옵션은 무엇입니까? Area_Code 및 Due_date에 대한 인덱스와 함께 인덱스 힌트를 사용하고 있습니다. – dotnetFAQ

+0

@dotnetFAQ 주문을 by by하면 더 빠릅니까? 그렇다면 색인 생성을 고려해 볼 가치가 있습니다. 쿼리 계획 ('EXPLAIN')을 보면서 병목 현상이 발생한 곳을 확인 했습니까? – podiluska

관련 문제