메뉴 건너뛰기

bysql.net

4. 조인 순서의 중요성

2011.03.30 07:39

AskZZang 조회 수:5329

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

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

번호 제목 글쓴이 날짜 조회 수
15 8. 고급 조인 테크닉-2 오라클잭 2011.04.05 12564
14 5. 카디널리티 오라클잭 2011.04.27 12921
13 6. IOT, 클러스터 테이블 활용 오예스 2011.02.26 15603
12 4. PQ_DISTRIBUTE 힌트 휘휘 2011.06.27 15609
11 1. 인덱스 구조 file 운영자 2011.03.30 15954
10 4. 통계정보 Ⅰ file 토시리 2011.04.25 16015
9 6. 히스토그램 오예스 2011.04.25 17401
8 4. 조건절 Pushing 오예스 2011.05.31 17491
7 5. Outer 조인 file 휘휘 2011.03.28 17670
6 2. 인덱스 기본 원리 balto 2011.02.18 18847
5 6. 스칼라 서브쿼리를 이용한 조인 file balto 2011.03.27 18959
4 1. Nested Loops 조인 file 오라클잭 2011.03.23 23031
3 5. 병렬 처리에 관한 기타 상식 [1] file balto 2011.06.26 28162
2 1. 테이블 파티셔닝 오라클잭 2011.06.21 28273
1 Front Page file 운영자 2011.02.16 114630