풀 조인 은 적 게 쓰 는 게 좋 을 것 같 아 요.

오늘 아침 에 회사 에 도착 하 니 JOB 한 명 이 몇 시간 을 뛰 었 는데 도 멈 추 지 않 았 고 테스트 할 때 이 임 무 는 2 분 만 에 끝났다.그래서 DBA 에 게 원인 을 찾 아 주세요. 원래 코드 는 대체적으로 이 렇 습 니 다.
select g2.col1, g1.col2
  from (select nvl(tt.col1,pp.col1) col1, nvl(tt.col2,0) + nvl(pp.col2,0) col2
          from (select u.col1, count(*) as col2
                  from a g
                 inner join b u on g.username = u.username
                 where ...
                 group by u.col1) tt
                full join
                (select col1, count(*) as col2
                  from c t1, d t2
                 where ...
                 group by t2.col1) pp
         on tt.col1 = pp.col1) g1,
       b g2
 where ...;

 분해 집행 을 거 쳐 문제 가 없고 전체 집행 만 느 린 것 으로 나 타 났 다.실행 계획 을 살 펴 보 니 full join 에 문제 가 있 었 습 니 다. tt 의 결과 가 많 고 pp 의 결과 가 상당히 적 었 습 니 다.DBA 는 unoin all 로 바 꾸 자고 제안 하여 다음 과 같이 바 꾸 었 습 니 다.
select g2.col1, g1.col2
  from (select col1, sum(col2)
          from (select u.col1, count(*) as col2
                  from a g
                 inner join b u on g.username = u.username
                 where ...
                 group by u.col1
                union all
                select col1, count(*) as col2
                  from c t1, d t2
                 where ...
                 group by t2.col1)
         group by username) g1,
       b g2
 where ...;

 임 무 를 다시 수행 합 니 다. OK!
 
 
20110825
최근 에 Oacle 의 BUG 를 만 났 습 니 다. 저장 과정 에서 cube 함 수 를 실행 하여 600 오류 가 발생 했 습 니 다.
-- FOR < ORA - 00600: 내부 오류 코드, 매개 변수: [qcte 1], [0], [], [], [], [], [], [], [] > execute immediate 'alter session set' optimizer cost based transformation '= off';
 
이 동시에 오늘 DBA 가 저 에 게 문 제 를 해결 해 주 었 습 니 다. full join 이 일 으 킨 것 입 니 다. 이 SQL 의 실행 계획 cost 치가 매우 무 섭 고 두 시간 동안 진행 하 는 진 도 는 0% 에 불과 합 니 다.
DBA 는 비장의 카드 를 꺼 냈 다.
alter session set "_complex_view_merging" = false;
문제 해결!(물론 실제로 다른 방법 으로 돌아 갈 수 있다. 그것 은 full join 을 사용 하지 않 아 도 문 제 를 해결 할 수 있다)

좋은 웹페이지 즐겨찾기