본문으로 바로가기

[Database] NL / Sorted Merge / Hash Join 의 특징

category Database 2023. 6. 22. 22:47

 

1. NL Join ( Nested Loop ) 

두 테이블을 말 그대로 Nested Loop 형대로 반복문 돌듯이 연결시키는 조인 형태 

 

1. 선행 테이블에서 조건을 만족하는 행을 찾는다 
2. 선행 테이블에서 찾은 키를 갖고 인덱스를 거쳐 후행 테이블에 조인을 시도한다
3. 1, 2 반복

 

NL은 랜덤 액세스로 데이터를 읽는다. 

랜덤 액세스의 예로는 인덱스 스캔이 있으며 대량의 데이터를 랜덤 액세스로 접근하면 I/O가 발생되어 성능이 좋지 않다. 

NL은 인덱스가 있어야 가능하며 이는 스캔 시 고유의 ROWID를 얻을 수 있는데 이 ID 가 I/O 블럭의 위치를 가르킨다. 

 

랜덤 액세스란 ?
무작위라는 random이 아닌 어디서든 똑같은 시간으로 임의 접근 가능하다는 의미 
IO 블럭을 읽을 때 한꺼번에 접근하는 것이 아닌 하나의 블럭을 읽는 것이다. 그래서 많은 양의 데이터가 접근되면 성능이 저하된다는 것. 

하나의 블록이 아닌 여러 블록을 접근하는 방식을 full scan이라고 한다. 

 

NL 조인에서 랜덤액세스에 대해 주의할 점 

 

확인 랜덤 액세스
  • WHERE 절에 인덱스 외 다른 컬럼이 들어가게 되는 경우 
    • I/O 블럭을 접근해서 데이터를 읽었으나, 인덱스가 아닌 다른 컬럼으로 인해 해당 데이터가 버려지는 경우 성능 저하

 


2. Sort Merge Join 

정렬 - 머지를 사용한 조인 형태

범위가 많을 때 주로 사용하는 조인이며 양쪽 테이블을 각각 Access 하여 그 결과를 정렬하고 정렬 결과를 토대로 병합하는 방식

 

1. 선행 테이블에서 조건을 만족하는 행을 찾는다
2. 찾은 행에 대해서, 선행 테이블의 조인 키를 기준으로 데이터 정렬
3. 후행 테이블에서 조건에 맞는 행을 찾는다
4. 후행 테이블에서 찾은 행을 정렬한다. 
5. 정렬 결과를 토대로 두 테이블을 비교한다. 

 

랜덤 액세스로는 부담되는 넓은 범위의 데이터처리, 마땅한 인덱스가 없을 때 사용하는 조인 방식이다.

주로 Full scan을 하며 두 테이블의 크기가 비슷할 때 유리하며 Hash Join에 비해 동등조건이 아닌 곳에서도 사용이 가능하다. 

 

이전의 일련의 작업으로 이미 정렬이 되어있다면, 캐싱된 데이터를 바탕으로 정렬이 발생하지 않을 수 있다. 

 

하지만 정렬할 데이터가 많으면 디스크를 그만큼 사용해야 하기 때문에 성능이 떨어지고 

동등조건이라면, 대용량 처리에는 CPU자원을 소모하는 Hash Join이 유리하다. 

 


3. Hash Join

해싱과 해시테이블을 이용해 두 테이블을 조인하는 형태

1. 선행 테이블을 읽어 Hash Area에 해시 테이블을 생성한다. 
2. 후행 테이블을 읽어 해시 함수를 이용해 연산하여 테이블에 접근한다. 

 

  • Hash Join은 CPU 위주 처리이기 때문에 CPU가 좋으면 Hash Join 성능이 좋아진다. (반대로 말하면 자원을 많이 먹을수도 있다)
  • 랜덤 액세스와 Sort Merge Join의 정렬 부담감을 해소하기 위해 등장했다.
  • 해시 테이블을 메모리에 적재해야하기 때문에 선행테이블의 크기가 작은 것이 좋다. 
  • 해시 작업으로 인해 CPU 사용이 증가할 수 있고 테이블을 생성해야하기 때문에 수행 빈도가 낮고 오래걸리는 대용량 테이블을 JOIN할때 주로 사용된다. 
  • 데이터 간의 중복값이 없을 때 유리하다 (해시 충돌 최소화)