outer join 질문 드립니다. 0 3 2,493

by 고기브페 [2014.03.12 15:21:19]


안녕하세요 글은 자주 못쓰지만 
많은 자료들을 보고 항상 큰도움이 되고 있습니다 

outer join 중에 궁굼한것이 생겨 이렇게 글을 올리게 되었습니다.

일단 사용 하는 db 는 oracle 9 인데

outer join 을 


select *
from a , b
where a.aa = b.aa(+) 
이런 식으로 표기 하던 것에 

b 테이블에 조건이 붙을 것이 생겨 

select *
from a left outer join b
      on a.aa = b.aa

형식으로 사용하게 되었습니다 

두 구문 자체가 동일한 left outer join 을 나타내는 
쿼리 인데  속도차이가 엄청나게 발생을 하는 것을 발견하였습니다.

기존에 약식(+) 처리 하는것은 쿼리 속도가 1초 내외로 걸리는 반면
두번째 것으로 변경하여 조회를 하니 3분이 넘도록 조회가 안되는 현상입니다.

모든 테이블 정보를 공유 하면 좋겠지만.. 
그렇지 못하는 점 양해 부탁드리며 

두 구문이 동일하게 left outer join 이라고 알고 있는데 
두 명령어의 차이는 무엇이 있을까요?

담변하시기 번거로우시면 제가 어디의 자료를 찾아 보면 좋을까요?

( 서브 쿼리를 사용하는 방법으로 일단 문제 해결을 하였으나 궁굼증이 생기네요)
( ps 토드에서 나오는 실행 계획에서 뜨는 인덱스 순서는 동일하게 나옵니다 )

by 마농 [2014.03.12 15:28:54]
두 구문의 의미상 차이나 동작방식의 차이는 없습니다.
구문이 다를 뿐이죠.
아마도 실제로 사용하신 두 쿼리가 다를 것으로 생각됩니다.

by 아발란체 [2014.03.12 15:29:24]

둘 다 SELECT * 부분을 SELECT COUN(*)로 변경하고 속도를 확인해보세용.


by 고기브페 [2014.03.12 15:57:47]
답변 감사 합니다 
혹시 몰라 실제 테이블 명과 컬럼명은
올리지 못하지만 원래 시도 하려던 쿼리의 테이블과 컬럼명, 데이터 값만 변경한 쿼리 입니다.

select a.aa, a.bb, a.cc,min(b.dd)
from a, b
where a.aa = b.aa(+)
and a.bb = b.bb(+)
and a.cc = b.cc(+)
and a.aa = 'E'
and a.ee = 'AAA'
group by a.aa,a.bb,a.cc

select a.aa, a.bb,a.cc,min(b.dd)
from a left outer join b
    on a,aa = b.aa and a.bb = b.bb and a.cc = b.cc
where a.aa = 'E'
and a.ee = 'AAA'
group by a.aa,a.bb,a.cc

MIN 처리 된부분을 COUNT(*) 로 변경후 조회 해보니 속도차이는 거의 없네요..
MIN 으로 묶은 부분에 NVL로 먼저 감싸니 쿼리 속도에는 큰차이가 없네요 
NVL 로 처리를 안하다 보니 GROUP 함수 처리 시 NULL 떄문에 문제가 난듯합니다.
(+) 로 할때는 NULL 값을 자동으로 처리 하는 듯한데 
LEFT OUTER JOIN 으로 풀어 쓸때는 처리하는데 느려 지는듯 합니다.


마농님 OUTER JOIN 설명 감사 합니다~
아발란체님 COUNT(*) 로 확인을 해봐서 어디서 문제일지 유추가 가능했습니다. 감사합니다~

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입