태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'오라클/옵티마이저'에 해당되는 글 1건

  1. 2010.11.09 아우터 조인 제거(Outer Join Elimination) (4)

아우터 조인 제거(Outer Join Elimination)

오라클/옵티마이저 2010.11.09 13:12
아우터 조인에서 다음과 같은 패턴의 오류가 종종 발생하는 것 같습니다.
select *
from t1, t2
where t1.c1 = t2.c1 (+)
         and t2.c2 = 1
;
위의 쿼리의 문제는 무엇일까요?

아우터 조인 자체가 불필요하다는 것입니다. 아우터 조인에 의해서 얻은 데이터 중 t1에만 있고 t2에는 없는 데이터의 t2.c2는 NULL입니다. 따라서 t2.c2 = 1 조건이 있다는 것은 아우터 조인에 의해 생긴 데이터중 t2가 존재하지 않는(NULL인) 데이터를 제거한다는 것과 같은 의미입니다. 즉 위의 쿼리는 아래 쿼리와 논리적으로 동일합니다.

select *
from t1, t2
where t1.c1 = t2.c1
         and t2.c2 = 1
;
하지만 아우터 조인의 고유의 특성 때문에 위의 두 쿼리는 전혀 다른 실행 계획을 가지게 됩니다.

아우터 조인의 특징 중 하나는 조인의 방향이 고정되어 있다는 것입니다.

가령 { where t1.c1 = t2.c1(+) }으로 정의되었다면, 반드시 테이블 t1이 드라이빙 테이블이 됩니다. 따라서 { t2.c2 = 1 } 조건은 드라이빙 조건으로 사용될 수 없죠. 따라서 Hash Join + Table Full Scan이 선택될 확률이 매우 높습니다.

반면에 { where t1.c1 = t2.c1 }으로 정의되었다면, 테이블 t1과 t2 중 로우 수가 작은 것이 드라이빙 테이블이 될 것입니다. 따라서 { t2.c2 = 1 } 조건이 드라이빙 조건이 될 수 있습니다. 따라서 테이블 t2를 드라이빙으로 하는 Nested Loops Join + Index Range Scan이 선택될 활률이 높습니다.

단, 여기서 오라클이 두 가지 편법을 사용합니다.

  1. 아우터 조인(Outer Join)을 이너 조인(Inner Join)으로 바꿀려고 시도합니다. 이것을 아우터 조인 제거(Outer Join Elimination)라고 합니다. 위에서 예로 든 아우터 쿼리는 아우터 조인 제거의 대상이 됩니다.
  2. 조인 순서를 바꿀려고 시도합니다. { where t1.c1 = t2.c1(+) } 조인은 항상 t1 -> t2 의 순서를 따라야하지만, Hash Outer Join인 경우에 한해서는 t2를 드라이빙으로 바꿀 수 있습니다. 즉 가능한 적은 크기의 데이터가 드라이빙 위치에 오도록 바꿀 수 있습니다.
위의 두가지 편법에 의해 어느 정도 문제가 해결되기는 하지만, 조인 방향이 고정되어 있다는 아우터 조인의 특성에 기인하는 본질적인 문제는 항상 조심해야합니다. 아우터 조인을 잘못 사용하면 성능이 느리다다는 불평 중 상당 수가 이 특징으로 인해 나타나는 것으로 봅니다.

아우터 조인의 특성으로 인해 발생하는 재미있는 문제가 Ask 엑셈에 등록되어 있어서 소개합니다.

위에서 소개한 개념을 이해한 뒤라면 매우 재미있게 읽을 수 있을 것 같습니다.
저작자 표시
신고

'오라클 > 옵티마이저' 카테고리의 다른 글

아우터 조인 제거(Outer Join Elimination)  (4) 2010.11.09
Trackback 1 : Comments 4
  1. 궁금이 2010.11.15 09:13 신고 Modify/Delete Reply

    위의 글은 t1이 1이고 t2가 M 이라는 상황에서 진행된것인가요 아우터조인은 알듯하면서도 헷갈릴때가 있어서요

    • 욱짜 2010.11.15 19:07 신고 Modify/Delete

      최초의 질문을 보면 동일한 테이블(T)에 T1, T2의 알리아스를 붙여서 사용하고 있습니다. 아마 테스트용 데이터를 만드는 과정에서 편의상 그렇게 한 것 같습니다.

      아우터 조인에서 "헷갈리는 부분"을 정리해주시면 그 문제를 심도깊에 논의해보는 것도 재미있겠는데요.

  2. salvationism 2010.11.16 10:21 신고 Modify/Delete Reply

    여기에 질문 내용이 맞는지 모르겠는데 ask엑셈 글을 스마트폰으로 보면 어떤글은 제대로 보이는데 어떤글은 html소스.그 자체로 보입니다 수정되면참 편할거같습니다^^

    • 욱짜 2010.11.16 11:04 신고 Modify/Delete

      저희들도 그 문제를 인식했는데, 내부적으로 사용하는 공개소프트웨어의 문제라서 추적이 쉽지 않은 상태입니다.

      HTML 소스가 보이는 경우 새로 고침(리도르)하시면 정상적으로 보이실겁니다.

Write a comment

티스토리 툴바