메뉴 건너뛰기

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 6. 조인 제거 AskZZang 2011.06.01 5440
34 4. 조건절 Pushing 오예스 2011.05.31 17477
33 5. 조건절 이행 file balto 2011.05.30 5465
32 2. 서브쿼리 Unnesting 토시리 2011.05.18 2079
31 3. 뷰 Merging 오라클잭 2011.05.17 6082
30 1. 쿼리 변환이란? 운영자 2011.05.16 6258
29 8. 통계정보 Ⅱ AskZZang 2011.05.04 5913
28 7. 비용 file balto 2011.05.02 4996
27 5. 카디널리티 오라클잭 2011.04.27 12918
26 6. 히스토그램 오예스 2011.04.25 17377
25 4. 통계정보 Ⅰ file 토시리 2011.04.25 16013
24 3. 옵티마이저의 한계 휘휘 2011.04.19 6698
23 2. 옵티마이저 행동에 영향을 미치는 요소 balto 2011.04.18 6160
22 3. 옵티마이저의 한계 - P 휘휘 2011.04.18 3699
21 1. 옵티마이저 file 휘휘 2011.04.18 6064
20 8. 고급 조인 테크닉-1 file 휘휘 2011.04.05 6460
19 8. 고급 조인 테크닉-2 오라클잭 2011.04.05 12560
18 7. 조인을 내포한 DML 튜닝 오예스 2011.04.04 9946
» 4. 조인 순서의 중요성 AskZZang 2011.03.30 5328
16 1. 인덱스 구조 file 운영자 2011.03.30 15951