연결을 할 수 있도록 사전에 하는 재배치를 정렬(Sort) 방식으로 하여, 이들을
서로 연결(Merge)하는 방식이 바로 Sort Merge 조인이다.
이 조인은 정렬을 해야 한다는 부담을 무시하고 생각해 보면 랜덤 액세스를 하지
않고 정렬된 집합을 스캔해 가면서 머지를 하기 때문에 연결을 하는 속도는 매우
빠르다. 문제는 결국 정렬작업에 대한 부담에 달려있다.
[VLDB:그림 2-2-16]
1) TAB1은 FLD1 인덱스를 경유하여 FLD1='111' 인 범위를 차례로 액세스한 후 체크조건인
FLD2 LIKE 'AB%'를 적용하고 성공한 것들에 대해서만 연결고리인 KEY1의 값으로 정렬해
둔다.
2) TAB2도 COL1 인덱스를 경유하여 COL1='10' 인 범위를 차례로 액세스하고, 연결고리인
KEY2의 값으로 정렬해 둔다.이때 TAB2 에는 체크 조건이 존재하지 않으므로 액세그한
모든 것에 대해 정렬이 수행된다.
3)두 개의 정렬된 결과를 스캔하면서 KEY1=KEY2를 만족하는 로우를 찾도록 머지하여
운반단위가 채워지면 추출된다. 여기서 말하는 머지란 정렬된 양쪽 값을 서로 비교하여
스캔해 내려가다가 다른 쪽 값이 비교할 값보다 커지면 멈추고, 그 커진 값과 반대편
값을 비교하여 다시 내려가는 방식으로 진행 된다. 이 방식은 정렬해 둔 결과를 스캔하면
서 연결하므로 연결작업에는 랜덤 액세스가 발생하지 않는다.
Nested Loops 조인과의 차이점
: TAB1의 FLD1, TAB2의 COL1 인덱스만 사용되고,
연결고리인 KEY1, KEY2 의 인덱스는 전형 사용되지 않았고, 단지 머지 조건으로 사용됨
가) Sort Merge 조인의 특징
1) 동시적으로 처리된다. 조인 대상 집합은 각자가 상대 집합의 처리결과와 상관없이
자신이 보유한 처리조건만 가지고 액세스하여 정렬해 둔다. 양쪽 집합이 모두 준비가
완료되어야만 머지를 시작할 수 있으므로 순차적인 처리가 불가능하다 (동시적)
2) 각 집합이 준비작업을 할 때 다른 집합에서 처리한 결과를 제공받지 않는다.
즉, 자신에제 주어진 상수값에 의해서만 범위를 줄인다. 예외 존재 ( 독릭접 )
3) 정렬준비가 완료된 후에라야 조인을 시작할 수 있으므로 원초적으로 부분범위처리를
할 수 없어 항상 전체범위처리를 한다.(전체범위 처리)
4) 주로 스캔방식으로 처리된다. 각자의 처리범위를 줄이기 위해서 인덱스를 사용하는
경우만 랜덤 액세스가 발생할 수 있으나, 연결하는 머지작업은 스캔방식이다.(스캔방식)
5) 주어진 조건에 있는 모든 컬럼들이 인덱스를 가지고 있더라도 모두가 사용되는 것은
아니다. 연결고리가 되는 컬럼은 인덱스를 전혀 사용하지 않는다.(선택적)
6) 조인의 방향성과는 거의 무관하다.
7) 스스로 자신의 처리범위를 줄이기 위해 사용되는 인덱스는 대개 가장 유리한 한
가지만 사용된다. 그러나 그 외의 조건들은 비록 인덱스를 사용하지 못하더라도
머지할 작업대상을 줄여 주기 때문에 중요한 의미를 가진다.
이퀄조인이고 먼저 정렬된 집합으로부터의 최소,최대값을 체크 조건의 역할이 가능하고,
이를 통한 수행속도 차이가 발생 할 수 있다.
나) Sort Merge 조인의 적용기준
1) 어차피 전체범위 처리를 할 수 밖에 없는 프로세싱에서 검토될 수 있다.
2) 상대방 테이블에서 어떤 상수값을 받지 않고서도 충분히 처리범위를 줄일 수 있다면
상당한 효과를 기대할 수 있다. 상수값을 받아 처리를 했을 때와 스스로 처리범위를
줄여서 처리했을 때를 비교해 보아 상수값을 받더라도 범위를 크게 줄여주지 못한다면
이 조인이 일반적으로 유리하다.
3) 주로 처리량이 많으면서 항상 전체범위를 해야 하는 경우에 유리해진다.
그 이유는 처리방식이 주로 스캔방식으므로 많은 양의 랜덤 액세스를 줄일 수가
있디 때문이다.
4) 연결고리 이상 상태에 영향을 받지 않으므로 연결고리를 위한 인덱스를 생성할
필요가 없을 때 매우 유용하게 사용할 수 있다.
5) 스스로 자신의 처리범위를 어떻게 줄일 수 있느냐가 수행속도에 많은 영향을 미치므로
보다 효율적으로 액세스할 수 있는 인덱스 구성이 중요하다.
6) 전체범위처리를 하므로 운반단위의 크기가 수행속도에 영향을 미치지 않는다.
가능한 운반 단위를 크게 하는 것이 FETCH 횟수를 줄여준다.
7) 처리할 데이터 량이 적은 온라인 애플리케이션에서는 Nested Loops 조인이 유리한
경우가 많으므로 함부로 Sort Merge 조인을 사용하지 말아야 한다.
8) 옵티마이져 목표(Goal)가 'All_ROWS'인 경우는 자주 Sort_merge 조인이나 해쉬조인으로
실해계획이 수립되므로 부분범위 처리를 하고자 한다면 이 옵티마이져 목표가 어떻게
지정되어 있는지에 주의하여야 한다.
9) 충분한 메모리 활용이 가능하고, 병렬처리를 통해 빠르게 정렬작업을 할 수 있다면
대량의 데이터 조인에 매우 유용하게 적용할 수 있다.