메뉴 건너뛰기

bysql.net

2.3.2. Sort Merge 조인

  • Sort Merge 조인?

연결 할 수 있는 상태로 만드는 재배치를 정렬(Sort) 방식으로 하여, 이들을 서로 연결(Merge)하는 방식

    • 장점 : 랜덤 액세스를 하지 않고 정렬된 집합을 스캔해 가면서 머지하기 때문에 연결 속도가 빠름
    • 단점 : 정렬작업에 대한 부담 발생

2_1_16.jpg


1. TAB1 

  • FLD1 인덱스 경유 → FLD1 = '111'인 범위 차례로 액세스 → FLD2 Like 'AB%' 체크 → 연결고리 KEY1 값으로 정렬

2. TAB2 

  • COL1 인덱스 경유 → COL1 = '10'인 범위 차례로 액세스 → 연결고리 KEY2 값으로 정렬

3. 두 개의 정렬 결과를 스캔하여 KEY1 = KEY2 만족 로우를 찾도록 머지하여 운반단위를 채워 추출


머지란?

   - 정렬된 양쪽 값을 서로 비교하며 스캔하여 다른 쪽 값이 비교할 값보다 커지면 멈추고, 

      그 커진 값과 반대편 값을 비교 후 다시 내려가는 방식으로 진행

   - 정렬 결과를 스캔하면서 연결되므로 랜덤 액세스 발생 X


※ Nested Loops 조인과 차이

    각 컬럼에 인덱스가 있다해도 연결고리인 KEY1, KEY2의 인덱스는 전혀 사용되지 않고 단지 머지의 조건으로만 사용


  • 특징
    • 동시적 처리 - 조인대상 집합은 각자가 상대 집합의 처리결과와 상관없이 자신의 처리조건만 가지고 액세스 후 정렬

                   ☞ 양쪽 집합이 모두 준비 완료되어야 시작 가능 → 순차적 처리 불가능

    • 독립적 처리 - 각 집합의 결과에 영향없이 자신에게 주어진 상수값에 의해서만 범위가 정해짐
    • 전체범위 처리 - 정렬 후 조인이 시작되기에 전체범위 처리
    • 스캔방식 처리 - 각자 인덱스를 사용하는 경우만 랜덤 액세스가 발생 되고, 연결하는 머지작업은 스캔방식
    • 선택적 처리 - 주어진 조건의 모든 컬럼의 인덱스가 존재하여도 모두 사용하지 않음(연결고리 컬럼은 인덱스 사용 X)
    • 무 방 향 성 - 조인의 방향과는 거의 무관


  • 적용기준
    • 전체범위 처리를 할 수 밖에 없는 프로세싱에서 검토
    • 상대방 결과 값에 의해 범위를 크게 줄어들지 않을 시 일반적으로 유리함 (but 부분범위 처리 가능여부 고려)
    • 처리량이 많으면서 항상 전체범위 처리 할 경우 유리 (주로 스캔방식 처리로 많은 양의 랜덤 액세스를 줄임)
    • 연결고리 인덱스 생성이 필요가 없을 시 유용
    • 스스로 자신의 처리범위를 줄이느냐에 따라 수행속도 영향이 크기에 효율적 액세스 가능한 인덱스 구성 중요
    • 전체범위 처리로 운반단위의 크기가 수행속도에 영향을 크게 미치지 않음 (운반단위 크기에 따라 Fetch 수 차이)
    • 처리 데이터량이 적은 온라인 애플리케이션에서 Nested Loops 조인이 유리한 경우가 많기에 Sort Merge 조인 사용 시 고려
    • 옵티마이져 Goal이 'ALL_ROWS' 경우, 자주 Sort Merge 조인이나 해쉬조인으로 실행계획이 수립되기에 부분범위 처리를 원할 시 옵티마이져 목표 지정 확인 필요
    • 충분한 메모리 활용이 가능하고, 병렬처리로 빠르게 정렬작업 가능 시 대량의 데이터 조인에 매우 유용


※ 요약

    • 상대방에게 아무런 값도 받지 않고 자신이 가지고 있는 조건만으로 처리범위가 정해짐
    • 랜덤 액세스를 줄일 수 있으나 항상 전체범위 처리




2.3.3. Nested Loops 조인과 Sort Merge 조인의 비교


SELECT a,FLD1, ...., b.COL1, ......

FROM TAB1 a, TAB2 b

WHERE a.KEY1 = b.KEY2

    AND a.FLD1 = '111'

    AND a.FLD2 like 'AB%'

    AND b.COL1 = '10' (삭제)


         ■ 위의 SQL 처리에 따른 Nested Loops 조인과 Sort Merge 조인 비교

  

 ▼ Nested Loops 조인

2_1_17.jpg


  ※ 선접근 테이블의 조건이 삭제되느냐 후접근 테이블의 조건이 삭제되느냐에 따라서 처리 시간 차이 발생

      선접근 테이블 조건이 삭제 될 시 중간 결과행 증가로 조인 시 랜덤 액세스 증가

      후접근 테이블 조건이 삭제 될 시 조인 후 해당 조건 체크로 큰 차이가 없음.



 ▼ Sort Merge 조인

2_1_18.jpg


   ※ 체크 조건이 없기 때문에 테이블 전체 정렬로 처리 시간 증가


■ 전체범위 검색 (Order by 사용) 시 Nested Loops 조인과 Sort Merge 조인 비교

  

 ▼ Nested Loops 조인 

2_1_19.jpg

 

  ▼ Sort Merge 조인

2_1_20.jpg