관계형 데이터베이스(RDBMS) 조인 알고리즘 종류 - Nested Loop Join / Hash Join / Sort Merge Join

nana·2024년 4월 17일
0

DataBase

목록 보기
2/8

📍 Nested Loop Join

  • 줄여서 NL JOIN이라고도 함.
  • 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 Row를 결함하여 원하는 결과를 조합하는 조인방식
  • 조인 조건에 해당하는 데이터를 찾으면 바깥쪽 루프의 다음 행으로 넘어가며 안쪽 루프는 처음부터 다시 시작.
  • 선행 테이블의 조건을 만족하는 행을 추출하여 후행 테이블을 읽으면서 조인을 수행한다.
  • 결과 행의 수가 적은 테이블을 조인 순서상 선행 테이블로 선택하는 것이 전체 일량을 줄일 수 있다.

✔ Driving Table & Driven Table

  • Driving Table : 조인을 할 때 먼저 액세스 되는 테이블
  • Driven Table : 나중에 액세스 되는 테이블
  • Driving Table은 옵티마이저가 결정하며 Driving이 아닌 테이블은 자연스럽게 Driven Table이 됨.
  • INDEX의 존재 및 우선순위 혹은 FROM절 에서의 TABLE 지정 순서에 영향을 받음.
    텍스트

✔ 장단점

  • 데이터 양이 적을 때는 성능이 좋지만 데이터 양이 많을 경우 비 효율적일 수 있다. (인덱스에 의한 랜덤 엑세스에 기반하고 있기 때문)
  • Driven Table에는 조인을 위한 적절한 인덱스가 생성되어 있어야 함.

✔ 결정규칙

  • 비용기반 옵티마이저(Cost-Based Optimizer,CBO)는 규칙의 우선순위가 아닌 쿼리를 수행하는데 소요되는 예상 비용을 바탕으로 실행 계획을 생성한다.
  1. 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음
    -> 이때 선행 테이블에 주어진 조건을 만족하지 않는 경우 해당 데이터는 필터링됨

  2. 선행 테이블의 조인 키를 가지고 후행 테이블에 조인 키가 존재하는지 찾음
    -> 조인시도

  3. 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는지 확인
    -> 선행 테이블의 조인 값이 후행 테이블에 존재하지 않으면 선행 테이블 데이터는 필터링됨(조인작업x)

4.인덱스에서 추출한 레코드 식별자를 이용하여 테이블을 액세스
-> 인덱스 스캔을 통한 테이블 액세스
~ 11) 반복수행

✔ 성능 개선 포인트

◾ 적절한 드라이빙 테이블의 선정

Driving Table의 조건을 만족하는 결과 row수가 많다면 그만큼 반복해서 Driven table에 접근해야하므로 WHERE절로 최대한의 데이터를 거를 수 잇는 테이블이나 애초에 데이터의 양이 적은 테이블로 선정해야한다.

  • Driven Table에 인덱스가 존재하지 않는다면 Driving Table에서 도출된 결과와 맞는지 FULL TABLE SCAN으로 일일이 비교해봐야한다.
  • 인덱스 생성고려해보거나 SORT/MERGE 등 다른 방식으로 바꾼다.

◾ 드라이빙 테이블 유도 방법

  • 힌트의 사용
    1) ORDERED : From절에 기술한 테이블 순서대로 제어
    2) LEADING : 힌트 내에 제시된 테이블이 드라이빙으로 처리됨.
  • 뷰를 사용
    뷰를 통해서 데이터를 먼저 읽어낼 수 있고 뷰로 데이터를 읽은 결과로 다음 테이블로 연결을 시도한다면 조인 순서를 제어할 수 있음.

📍 Hash Join

  • 큰 테이블과 작은 테이블 사이에서 주인 수행하는데 효과적.
  • 작은 테이블을 해시 함수를 사용해서 해시테이블로 만든 뒤
    큰 테이블의 각 행을 해시 함수에 적용하여 해시 테이블에서 조인할 데이터를 검색함.
  • 비용기반 옵티마이저(Cost-Based Optimizer,CBO) 사용할 때만 사용될 수 있는 조인방식.
  • '='비교를 통한 조인에서만 사용됨.
  • 주로 많은 양의 데이터를 조인해야 하는 경우 주로 샤용.
  • NL Join 랜덤 액세스와 Sort Merge Join의 문제점인 정렬 작업의 부담을 해결하기 위한 대안으로 등장.
  • 조인 컬럼의 인덱스가 존재하지 않을 경우에도 사용가능.
  • 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다.
  • 작은 테이블과 큰 테이블의 크기가 비슷하면 좋은 성능을 발휘하지만, 작은 테이블이 매우 작거나 클 때는 효율일 떨어질 수 있다.

✔ 사용처

  • JOIN 컬럼에 적당한 인덱스가 없어 NL JOIN이 비효율적일 때.
  • JOIN Access량이 많아 Random Access 부하가 심하여 NL JOIN이 비효율적일 때
  • Sort Merge Join을 하기에는 두 테이블이 너무 커 Sort 부하가 심할 때
  • 수행빈도가 낮고 쿼리 수행 시간이 오래 걸리는 대용량 테이블을 JOIN 할 때

✔ 성능 개선 포인트

◾ HASH TABLE을 만드는 과정을 효율화 한다.

해시 테이블을 생성하는 비용을 효율화 하는 것이 중요.
작은집합(Build Inut)이 Hash Area에 담길 정도로 충분히 작아야함.
Build Input 해시 키 칼럼에 중복 값이 거의 없어야 함.

◾ CPU성능을 향상한다.

HASH_AREA_SIZE에 지정된 크기만큼의 메모리가 할당되어 사용된다.
그렇기 때문에 CPU의 성능을 향상한다면 HASH JOIN의 성능을 향상시킬 수 있다.

📍 Sort Merge Join

  • 조인 컬럼을 기준으로 데이터를 정렬하여 조인을 수행.
  • 조회의 범위가 많을 때 주로 사용하는 조인 방법론.
  • 조인 조건 칼럼에 인덱스가 없거나 출력해야 할 결과 값이 많을 때 사용됨.
  • 연결고리에 인덱스가 전혀 없는 경우에 사용됨.
  • 조인조건으로 <,>,>=,<= 와 같은 범위 비교 연산자가 사용된 경우
  • 주로 스캔 방식으로 데이터를 읽는다.
  • 데이터 양이 많고 정렬 비용이 적을 때 우수하지만, 데이터 정렬에 많은 비용이 발생할 수 있다.

✔ 성능 개선 포인트

ACCESS 하는 속도를 향상 시킨다.

테이블을 Acess할 때 FULL TABLE SCAN이냐 INDEX RANGE SCAN이냐 하는 등 테이블을 Access 하는 방법을 다양한 방법을 통해 최적화 시킨다면 SORT MERGE JOIN의 속도도 자연스럽게 최적화 할 수 있다.

◾ 정렬 속도의 향상

조인 조건 컬럼이 이미 정렬되어 있다면 정렬하는 작업을 단축시키므로 검색 속도 향상에 도움을 준다.

◾ 양 쪽의 정렬까지 완료되는 속도를 맞춤

SORT MERGE JOIN은 양쪽 테이블을 ACCESS하고 조회한 데이터들을 정렬할때 어느 한쪽이라도 정렬 작업이 종료되지 않으면 한쪽이 대기 상태가 되고 다른 한쪽의 정렬이 완전히 끝날 때까지 조인이 시작될 수 없다.
그렇기에 두 테이블 ACCESS속도와 정렬 속도를 최대한 비슷하게 맞추어주는 것이 좋다.
비교해야 할 두 테이블의 데이터 양이나 정렬 속도를 고려하여 최대한 맞춰주는 것이 효율성 측면에서 좋다.

⭐출처
[DB] 데이터베이스 NESTED LOOPS JOIN (중첩 루프 조인)에 대하여
https://coding-factory.tistory.com/756

관계형 데이터베이스(RDBMS) 조인 알고리즘 종류: Nested Loop Join, Hash Join, Sort Merge Join
https://bestwizard.tistory.com/583

Join 기법 정리 (Nested Loop, Sort Merge, Hash)
https://devlog.changhee.me/posts/Join%EA%B8%B0%EB%B2%95_%EC%A0%95%EB%A6%AC/#2-sort-merge-join

profile
BackEnd Developer, 기록의 힘을 믿습니다.

0개의 댓글