4. 조인 순서의 중요성

조회 수 4519 추천 수 0 2011.03.29 22:39:13
AskZZang *.50.134.196

04 조인 순서의 중요성

?

** 조인 순서에 따라 쿼리 수행 성능이 달라질 수 있다. **

 

고객 테이블 : 10만 고객 관리

납입방법 테이블 : 신용카드, 자동이체, 지로 세 종류의 납입방법을 관리

 

양쪽 모두 조인 컬럼에 인덱스를 가지고 있다고 가정한다.

 

Q) 어떤 테이블을 먼저 드라이빙하는 것이 유리할까?

 

    SELECT /*+ USE_NL(A B) */ A.납입방법명, B.*

    FROM   납입방법 A, 고객 B

    WHERE  B.납입방법코드 = A.납입방법코드

 

 

* 필터 조건이 없을 때

 

    NL 조인에서는 무엇보다 RANDOM 액세스 발생량에 의해 성능이 좌우 된다.

 

    CASE1) 고객 테이블을 먼저 드라이빙하는 경우 => 총 20만번의 RANDOM 액세스 발생

        SELECT /*+ LEADING(B) USE_NL(A) */ A.납입방법명, B.*

        FROM   납입방법 A, 고객 B

        WHERE  B.납입방법코드 = A.납입방법코드

 

    CASE2) 납입방법 테이블을 먼저 드라이빙하는 경우 => 총 100,003만번의 RANDOM 액세스 발생

 

        SELECT /*+ LEADING(A) USE_NL(B) */ A.납입방법명, B.*

        FROM   납입방법 A, 고객 B

        WHERE  B.납입방법코드 = A.납입방법코드

 

결론 : 다른 필터 조건이 없는 상황에서는 작은 쪽 집합을 드라이빙하는 것이 유리하다.

 

 

* 필터 조건이 없을 때

 

    조건) 거주지역이 '부산' 인 고객만을 대상으로 조회할 때

             부산지역 고객은 전체 중 10%에 해당하는 1만명

             고객 테이블 거주지역 컬럼에 인덱스가 있다.

 

    CASE1) 고객 테이블을 먼저 드라이빙하는 경우 => 총 3만번의 RANDOM 액세스 발생

        SELECT /*+ LEADING(B) USE_NL(A) */ A.납입방법명, B.*

        FROM   납입방법 A, 고객 B

        WHERE  B.납입방법코드 = A.납입방법코드

        AND       B.거주지역 = '부산'

 

    CASE2) 납입방법 테이블을 먼저 드라이빙하는 경우 => 총 100,003만번의 RANDOM 액세스 발생

 

        SELECT /*+ LEADING(A) USE_NL(B) */ A.납입방법명, B.*

        FROM   납입방법 A, 고객 B

        WHERE  B.납입방법코드 = A.납입방법코드

        AND       B.거주지역 = '부산'

 

        => 고객 테이블 쪽으로 많은 액세스가 있었지만 거주지역 = '부산' 조건에 의해 90%가량이 버려지므로

             비효율이 존재

        => 인덱스에 '거주지역' 컬럼을 추가한 경우 : 총 10,003번의 RADNDOM 액세스 발생

 

결론 : 조인 조건 외에 필터 조건이 있을 때는 인덱스 구성에 따라 유,불리가 경정되며, 비효율이 없게끔

           인덱스를 잘 구성해 주기만 한다면 역시 작은 쪽 집합을 드라이빙하는 것이 유리.

 

 

* 소트 머지 조인과 해시 조인의 경우

 

소트 머지 조인 : 디스크소트가 발생할 정도의 큰 테이블을 포함할 때는 큰 테이블을 드라이빙하는 것이 좋다.

                          메모리소트방식으로 조인할 때는 작은 쪽 테이블을 드라이빙하는 것이 조금 더 빠르다.?

 

해시 조인 : HASH AREA에 BUILD INPUT을 모두 채울 수 있느냐가 관건이므로 두말할 것도 없이 작은 쪽 테이블을

                 드라이빙하는 것이 유리하다.