[99일차] JOIN의 수행원리

저요·2022년 12월 30일

2022 100th day challenge

목록 보기
96/97

JOIN의 수행원리

INNER JOIN, CROSS JOIN, OUTER JOIN NATURAL JOIN은 다들 익히 들었을 것이다. 오늘 다룰 JOIN은 여기서 한 단계 더 들어간 NESTED LOOP JOIN, SORT MERGE JOIN, HASH JOIN이다. 같은 JOIN들이지만 어떤식으로 내부적으로 수행되는 방식은 제각기 다를 수 있다. 오늘은 위의 JOIN들이 무엇인지 그리고 어떤식으로 수행되는지에 대해 다뤄보고자 한다.

NESTED LOOP JOIN

NESTED LOOP JOIN 중첩 FOR루프와 비슷하다고 생각하면 된다.
두 테이블을 조인하려고 한다. NESTED LOOP JOIN에서는 다음과 같은 방식으로 실행된다.

  1. OUTER TABLE에서 조건 ROW를 골라 맞는 데이터를 INNER TABLE에서 찾는다.
  2. 첫번째 ROW 조건을 다 찾은 다음에는 다른 두번째 ROW와 조건이 맞는 것을 확인한다.
  3. 그리고 두번째 ROW와 조건이 맞는 데이터를 다 찾아냈다면 다음 조건으로 넘어간다.

이것을 NESTED LOOP JOIN이라고 한다. 만약 NESTED LOOP JOIN을 실행하는데 INNER TABLE에 INDEX가 없다면 굉장한 비효율이 발생하다. 매 건을 수행할 때마다 FULL SACN을 실행하기 때문이다. 때문에 INNER TABLE의 인덱스 구성 전략이 매우 중요하다.

  • 대량의 테이블을 조인하는 방식에는 적절하지 않음
  • OLTP성 쿼리에 적절
  • 1:M의 데이터에서 1에 해당하는 것이 OUTER TABLE인게 성능에 유리하다.

SORT MERGE JOIN

NESTED LOOP JOIN과 비슷하게 중첩 FOR문과 유사하지만 먼저 JOIN 컬럼을 기준으로 SORTING을 진행한 뒤에 JOIN을 진행한다는 차이가 있다.

  • INNER TABLE에 적절한 인덱스가 없어서 NESTED LOOP JOIN은 너무 비효율적일때
  • EQUAL JOIN이 아닌 범위로 JOIN하는 경우일때 유리하다.
  • TABLE RANDOM ACCESS가 일어나지 않고, SORTING이 PGA영역에서 발생해, 경합이 발생하지 않아 성능에 유리하다.

HASH JOIN

OUTER TABLE을 BLILD INPUT으로 삼아서 HASH영역에 저장하는 JOIN 방법이다. HASH영역은 SORT MERGE JOIN에서 SORTING하는 PGA영역에 있기 때문에 처리 속도가 빠르다. HASH영역으로 올라갈 때는 JOIN컬럼을 기준으로 HASH FUNCTION이 적용되기 때문에 KEY컬럼에 중복값이 없을수록 성능에 유리하다.

  • 배치에서 쓰면 좋은 수행원리이다.
  • 대용량 테이블에 사용하면 좋다.
  • EQUAL JOIN만 가능하다.
  • SORT MERGE JOIN과 마찬가지로 RANDOM ACESS 부하가 없다.
HASH JOIN 사용에 주의해야할 점
  • HASH영역에 들어가는 테이블의 크기가 작아야 성능에 유리하다. 왜냐하면 HASH영역의 사이즈는 정해져 있고, 이 영역을 테이블이 초과해 버리면 오히려 디스크 영역을 사용하게 되면서 성능에 불리해진다.
  • 수행빈도가 높은 OLTP환경에서는 CPU나 메모리의 사용량이 늘어 성능이 안좋아질 수 있기 때문에 실행계획을 살펴보면서 조절해야한다. 적절한 수행계획으로 사용되지 않는다면 힌트를 사용해서 튜닝을 진행하면 된다.

참고

https://youtu.be/SVD5ldwVYpo

profile
웹개발

0개의 댓글