본문 바로가기
Database

[Database] SORT MERGE JOIN 최적화

by byeongoo 2021. 11. 14.

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

 

[DB] 데이터베이스 SORT MERGE JOIN (정렬 병합 조인)에 대하여

 SORT MERGE JOIN이란? 조회의 범위가 많을 때 주로 사용하는 조인 방법론이며 양쪽 테이블을 각각 Access 하여 그 결과를 정렬하고 그 정렬한 결과를 차례로 Scan 해 나가면서 연결고리의 조건으로 Merg

coding-factory.tistory.com

 

'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