메뉴 건너뛰기

bysql.net

4. 조인 순서의 중요성

2011.03.30 07:39

AskZZang 조회 수:5328

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을 모두 채울 수 있느냐가 관건이므로 두말할 것도 없이 작은 쪽 테이블을

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

번호 제목 글쓴이 날짜 조회 수
35 7. 인덱스 스캔 효율 file 휘휘 2011.03.06 8449
34 7. OR-Expansion AskZZang 2011.06.01 8327
33 1. 소트 수행 원리 file balto 2011.06.12 8013
32 2. 소트 머지 조인 오예스 2011.03.21 7912
31 4. 테이블 Random 액세스 부하 file 휘휘 2011.02.26 6942
30 1장. 인덱스 원리와 활용 휘휘 2011.02.21 6796
29 3. 옵티마이저의 한계 휘휘 2011.04.19 6698
28 3. 해시 조인 휘휘 2011.03.21 6486
27 8. 고급 조인 테크닉-1 file 휘휘 2011.04.05 6460
26 1. 쿼리 변환이란? 운영자 2011.05.16 6258
25 2. 옵티마이저 행동에 영향을 미치는 요소 balto 2011.04.18 6160
24 3. 뷰 Merging 오라클잭 2011.05.17 6082
23 1. 옵티마이저 file 휘휘 2011.04.18 6064
22 7. Sort Area 크기 조정 오예스 2011.06.16 5973
21 8. 통계정보 Ⅱ AskZZang 2011.05.04 5913
20 8. 인덱스 설계 AskZZang 2011.03.09 5726
19 5. 조건절 이행 file balto 2011.05.30 5465
18 6. 조인 제거 AskZZang 2011.06.01 5440
» 4. 조인 순서의 중요성 AskZZang 2011.03.30 5328
16 9. 비트맵 인덱스 휘휘 2011.03.07 5014