본문 바로가기

Hanbose Study/DB Study

Nested Loop Join과 Sort Merge Join

Nested Loop Join과 Sort Merge Join

MS-SQL

2006/10/09 11:24

조인은 크게 분류하면 Nested Loop 조인과  Sort Merge 조인이
있습니다.
지금부터 조인의 수행속도에 영향을 미치는 조인순서와
Nested Loop 조인, Sort Merge 조인에 대하여 알아보겠습니다.

조인의 순서를 변경해 보자.


관계형 데이터베이스 특성상 한 개의 테이블에 자료를 추출하기 보다는 2,3개 이상의
테이블을 조인(JOIN)하여 자료를 추출하는 경우가 많습니다. 대표적인 예로 사원테이블에서
부서번호를 가지고 부서 테이블에서 부서명을 가져오는 경우 사원 테이블과 부서 테이블을
조인해야 합니다.
이때 사원 테이블을 먼저 읽는 것이 수행속도가 빠를까요? 부서 테이블을 먼저 읽는 것이
수행속도가 빠를까요?

조인할 때 수행속도를 결정하는 것은 WHERE절을 구성하고 있는 칼럼들로 구성된
인덱스의 유무와 각 테이블의 처리범위의 정도, 데이터의 분포도 등 많은 요소들이 있습니다.
따라서, 조인 SQL문을 튜닝하다는 것은 각 요소들을 정확하게 판단하여 옵티마이저가
최적의 경로를 찾아 가는지 확인하고 옵티마이저에게 힌트를 주는 작업이라 할 수 있습니다.



조인의 순서를 변경해 보자.


▷ A 테이블은 처리범위가 매우 넓고, (20000 행)
    B 테이블은 처리범위가 좁다. (1000행)
▷ A 와 B 테이블은 1:1 조인이라고 가정.





조인 순서의 비교




처리 범위가 넓은 테이블을 먼저 읽는 경우 (좌측)



▷ 테이블 A의 20000건 중 첫 번째 자료를 읽는다
▷ 특정 테이블 A.칼럼 과 같은 값의 테이블 B.칼럼 값을 가진 자료를 테이블 B에서
    찾는다.
▷ 이 작업을 테이블 A의 자료건수(20000건) 만큼 반복한다.
▷ 테이블 B에 같은 데이터의 존재여부와 관계없이 항상 20000건의 랜덤
    ACCESS를 한다.





 처리 범위가 좁은 테이블을 먼저 읽는 경우 (우측)



▷ 테이블 B의 1000건 중 첫 번째 자료를 읽는다
▷ 특정 테이블 B.칼럼 과 같은 값의 테이블 A.칼럼 값을 가진 자료를 테이블 A에서
    찾는다.
▷ 이 작업을 테이블 B의 자료건수(1000건) 만큼 반복한다.
▷ 테이블 A에 같은 데이터의 존재여부와 관계없이 항상 1000건의 랜덤 ACCESS를
    한다.




대부분의 Nested Loop조인에서 첫 번째 처리하는 테이블의 - 이하 Driving 테이블 이라
한다 - 처리 범위가 수행속도에 많은 영향을 미칩니다. 가능한 처리범위가 적은 테이블이
Driving 테이블이 되도록 하면 최적의 조인을 구현할 수 있습니?