1. SORT MERGE JOIN이란?
Sort Merge는 결합 대상 테이블들을 각각 결합키로 정렬하고, 일치하는 결합키를 찾으면 결합한다.
Nested Loop의 중첩 for문과 유사하다고도 볼 수 있음.
1. 각 테이블에 대해 동시에 독립적으로 데이터를 먼저 읽어 들인다.
2. 읽혀진 각 테이블의 데이터를 조인을 위한 연결고리에 대하여 정렬을 수행한다.
3. 정렬이 모두 끝난 후에 조인 작업이 수행한다.
2. SORT MERGE JOIN 특징
- 대상 테이블을 모두 정렬해야 하므로 메모리를 많이 소비. Hash는 한쪽 테이블에 대해서만 해시 테이블을 만들므로 Hash보다 많은 메모리를 사용한다.
- Hash와 다르게 부등호를 사용한 결합에도 사용할 수 있다. 단, 부정조건 결합에서는 사용할 수 없다.
- 테이블이 결합 키로 정렬되어 있다면 정렬을 생략할 수 있다.
- 테이블을 정렬하므로 양쪽 테이블을 모두 스캔한 시점에 결합을 완료할 수 있다.
- 테이블의 정렬에 많은 시간과 리소스를 요구할 가능성이 있으므로, Nested Loops와 Hash를 우선적으로 고려!
3. 사용하는 경우
1. inner table쪽에 적절한 index가 없어서 nested loop 조인을 할 수 없을 경우
2. 대용량의 자료를 조인할때 유리한 경우
3. 조인 조건으로 <, >, <=, >=와 같은 범위 비교 연산자가 사용된 경우
4. 인덱스 사용에 따른 랜덤 액세스의 오버헤드가 많은 경우
4. 성능 개선 포인트
- ACCESS 속도 향상
- SORT MERGE JOIN은 가장 먼저 양쪽 테이블을 Access 하는 과정을 거쳐야 한다. 테이블을 Access 할 때 FULL TABLE SCAN이냐 INDEX RANGE SCAN인지 Access 하는 방법을 다양한 방법을 통해 최적화 가능
- 정렬 속도의 향상
- 조인 조건 컬럼이 이미 정렬되어 있다면 정렬을 하는 작업을 단축시켜 검색 속도 향상에 도움이 된다.
- 양쪽의 정렬까지 완료되는 속도를 맞추어줌
- SORT MERGE JOIN은 양쪽 테이블을 ACCESS하고 조회한 데이터들을 정렬할때 어느 한쪽이라도 정렬 작업이 종료되지 않으면 한쪽이 대기 상태가 되고 다른 한쪽의 정렬이 완전히 끝날 때까지 조인이 시작될 수 없다.
- 두 테이블 ACCESS속도와 정렬 속도를 최대한 비슷하게 맞추어주는 것이 좋다. 비교해야 할 두 테이블의 데이터 양이나 정렬 속도를 고려하여 최대한 맞춰주는 것이 효율성 측면에서 좋다.
- SORT_AREA_SIZE 최적화
- SORT MERGE JOIN은 두 테이블 간의 비교가 이루어지기 전에 수행하는 정렬 작업을 위해 별도의 정렬 공간이 필요하며 이 공간은 SORT_AREA_SIZE 크기만큼 메모리를 할당받아 사용하게 되고, 메모리가 부족하다면 Temporary Table Space를 이용하여 정렬을 수행하게 된다.
- Temporary Table Space를 사용하면 딜레이가 생기므로 SORT_AREA_SIZE를 적당한 크기로 설정해두는 것이 속도 향상에 도움이 된다.
REFERENCE
https://coding-factory.tistory.com/757
'Database' 카테고리의 다른 글
[Database] HASH JOIN 최적화 (0) | 2021.11.14 |
---|---|
[Database] 데이터베이스 I/O 원리 및 최적화 (0) | 2021.11.14 |
[Database] Nested Loop 최적화 (2) | 2021.11.14 |
[Database] 정규화 정리 (0) | 2021.10.24 |
Statement와 PreparedStatement (0) | 2021.10.17 |