대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(2) 데이터베이스

SQL (26) - Hash JOIN

monstro 2025. 2. 26. 21:52
728x90
반응형

이번 포스트에서는 JOIN의 3가지 방식 중에서 마지막 방식인 Hash JOIN에 대해 알아보겠습니다.

 

1) Hash JOIN 예제

SELECT *
FROM TestOrders AS o
	INNER JOIN TestCustomers AS c
	ON o.CustomerID = c.CustomerID;

 

실행 결과를 확인해보면 다음과 같습니다.

위의 쿼리는 실행하게 되면 Hash JOIN으로 동작하게 됩니다.

로직을 바꿔 Nested Loop JOIN이나 Merge JOIN을 실행하는 경우도 확인해보겠습니다.

SELECT *
FROM TestOrders AS o
	INNER JOIN TestCustomers AS c
	ON o.CustomerID = c.CustomerID
	OPTION (FORCE ORDER, LOOP JOIN);

SELECT *
FROM TestOrders AS o
	INNER JOIN TestCustomers AS c
	ON o.CustomerID = c.CustomerID
	OPTION (FORCE ORDER, MERGE JOIN);

 

위의 쿼리를 실행하면 다음과 같습니다.

중첩 루프 JOIN

 

병합 JOIN

 

따로 설정해주지 않은 이상, 쿼리는 DB가 선택한 가장 효율적인 방법을 사용합니다.

따라서 위의 쿼리에서는 Hash JOIN이 가장 효율적인 방법이 될 것입니다.

그렇다면 왜 DB는 Hash JOIN이 가장 효율적이라고 판단하였는지 알아보겠습니다.

 

2) Hash JOIN에 대하여

우선 Hash JOIN은 해시 테이블을 기반으로 동작합니다.

해시 테이블하나의 인덱스에 자료구조를 저장하고 개별 인덱스의 를 통해 

자료구조에 저장된 데이터를 접근할 수 있는 자료구조입니다.

 

오직 Key를 통해서만 데이터에 접근이 가능한 일방향 자료구조이고,

공간을 소모하는 대신, 데이터에 대한 매우 빠른 접근이 가능합니다.

 

시각적으로 표현하면 다음과 같습니다.

 

Hash JOIN은 JOIN하는 데이터 테이블을 대상으로 해시 테이블을 만들어 JOIN을 수행합니다.

 

3) Hash JOIN을 수행한 이유

다시 돌아와서 Hash JOIN을 수행한 이유에 대해 알아보겠습니다.

 

우선, NL JOIN을 수행했을 때를 살펴보겠습니다.

TestOrders가 Outer로, TestCustomers가 Inner로 동작합니다.

이때 Inner인 TestCustomers에서 인덱스가 없기 때문에 많은 비용을 소모합니다.

 

다음으로 Merge JOIN을 수행하는 경우를 알아보겠습니다.

현재 Outer와 Inner 모두 정렬을 수행하는 것을 볼 수 있는데,

둘다 데이터의 정렬이 이뤄지지 않았고 Many-to-Many 상황인 것을 확인할 수 있습니다.

 

결국 DB가 판단하기에 가장 효율적이라 판단한 것은 Hash JOIN으로 JOIN을 하는 방식입니다.

 

4) Hash JOIN의 특징

간단하게 Hash JOIN의 특징을 몇 가지 정리해보았습니다.

  • 정렬이 필요하지 않다
    • 따라서 정렬할 데이터의 양이 많다면 Merge JOIN 대신 충분히 고려 가능하다
  • INDEX의 유무에 상관하지 않는다
    • 단, Hash Table의 생성 비용을 간과해서는 안된다
  • NL JOIN과 다르게 Random Access하지 않는다
  • 데이터가 적은 쪽의 테이블을 Hash Table로 만드는 것이 유리하다

 

728x90
반응형