본문 바로가기

Hash Join 최적화를 위한 Equal(=) 조인 조건 활용

by ㅇㅍㅍ 2023. 7. 28.
Hash Join 최적화를 위한 Equal(=) 조인 조건 활용
728x90

Hash Join은 데이터베이스에서 자주 사용되는 Join 알고리즘 중 하나로, 두 개의 테이블을 조인할 때 사용됩니다. Hash Join은 주로 큰 테이블과 작은 테이블을 조인할 때 성능이 우수하며, 특히 조인 조건에 Equal(=) 조건이 포함되어 있는 경우에 효과적으로 사용됩니다. 이 글에서는 Hash Join 최적화를 위해 Equal 조인 조건을 활용하는 방법에 대해 알아보겠습니다.

Hash Join은 두 단계로 진행됩니다. 먼저 작은 테이블(Inner 테이블)의 데이터를 해시 테이블에 적재하고, 그 다음에 큰 테이블(Outer 테이블)의 데이터를 해시 함수를 통해 해시 테이블과 매칭시킵니다. 이때, 해시 테이블은 메모리에 적재될 수 있으며 메모리의 크기가 충분하지 않을 경우 디스크에 저장될 수도 있습니다.

Equal 조인 조건은 Hash Join에서 가장 효과적으로 사용될 수 있는 조인 조건입니다. 이는 두 테이블 간의 매칭이 1:1로 이루어지기 때문에, Inner 테이블의 각 행은 Hash 함수를 통해 고유한 버킷에 매핑되고, Outer 테이블의 각 행도 동일한 Hash 함수를 통해 동일한 버킷에 매핑되기 때문입니다.

만약 Hash Join의 조인 조건에 Equal(=) 조건이 없다면, 해당 조인 조건을 기준으로는 Hash Join을 수행할 수 없습니다. Hash Join은 Equal 조인 조건을 기반으로 작동하며, Inner 테이블의 각 행이 Outer 테이블의 특정 행과 1:1로 매칭되는 경우에 사용됩니다. 따라서 Equal 조인 조건이 없을 경우, Hash Join으로 풀리지 않는 상황이 발생할 수 있습니다.

이러한 경우에 옵티마이저는 다른 Join 알고리즘을 선택하게 됩니다. 대표적으로 Nested Loop Join이나 Merge Join 등의 다른 Join 알고리즘이 사용될 수 있습니다. Nested Loop Join은 한 테이블의 각 행을 다른 테이블의 모든 행과 비교하여 매칭되는 조인을 수행하는 방식으로, 조인 조건에 Index를 사용할 수 있다면 성능이 어느 정도 보장될 수 있습니다. Merge Join은 두 테이블이 이미 정렬된 상태에서 조인을 수행하는 방식으로, 조인 조건에 Index가 존재하지 않아도 조인이 가능한 경우에 사용될 수 있습니다.

따라서 Hash Join을 최적화하기 위해 Equal 조인 조건을 활용하는 것이 중요합니다. Equal 조인 조건은 Hash Join의 특성과 잘 어울리며, 성능을 향상시키는데 큰 기여를 합니다.

예를 들어, 주문 테이블과 주문 상세 테이블을 조인하는 경우를 생각해봅시다. 주문 테이블의 주문 번호와 주문 상세 테이블의 주문 번호는 1:1로 매칭되므로, 이러한 경우에는 Hash Join이 가장 효과적입니다.

 

SELECT *
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id;

 

위의 쿼리에서 주문 테이블의 주문 번호와 주문 상세 테이블의 주문 번호 간에는 Equal(=) 조인 조건이 포함되어 있습니다. 이를 통해 Hash Join이 이루어질 경우, Inner 테이블의 각 주문 번호는 해시 함수를 통해 고유한 버킷에 매핑되고, Outer 테이블의 주문 번호도 동일한 해시 함수를 통해 동일한 버킷에 매핑되어 빠르게 매칭이 이루어집니다.

 

대략적으로 Hash Join이 적용된 실행계획은 아래와 같이 나타날 수 있습니다:

--------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Cost      |
--------------------------------------------------------------
|  0  | SELECT STATEMENT    |             |       |           |
|  1  |  HASH JOIN          |             |   X   |   Cost1   |
|  2  |   TABLE ACCESS FULL | ORDERS      |   X   |   Cost2   |
|  3  |   TABLE ACCESS FULL | ORDER_ITEMS |   X   |   Cost3   |
--------------------------------------------------------------

 

위의 실행계획에서 "HASH JOIN" 연산이 사용되어 두 테이블을 조인하는 것을 알 수 있습니다. "TABLE ACCESS FULL"은 각 테이블에 대해 전체 테이블 스캔이 수행됨을 의미합니다.

실행계획에서 나타난 "Cost1", "Cost2", "Cost3" 등은 각 단계의 비용(Cost)을 나타내며, 데이터베이스 옵티마이저가 이를 기반으로 가장 효율적인 실행 계획을 선택합니다. 이때, "Cost" 값이 낮을수록 해당 계획이 더 효율적으로 간주됩니다.

실행계획의 "Rows"는 각 단계에서 반환되는 행의 개수를 의미합니다. "X"로 표시된 부분은 해당 정보가 실제 실행 시에 결정되는 값으로, 실행 시에 실제 레코드 수에 따라 달라질 수 있습니다. 따라서 실행 시점에 실제 값으로 채워지게 됩니다.

 



인덱스를 통해 Equal(=) 조인 조건을 만족시키는 컬럼에 대해 인덱스를 생성하면 Hash Join의 성능을 더욱 향상시킬 수 있습니다. 예를 들어, 주문 날짜(order_date)를 기준으로 주문 테이블과 주문 상세 테이블을 조인하는 경우, order_date 컬럼에 인덱스를 생성하여 Hash Join의 성능을 최적화할 수 있습니다.

 

CREATE INDEX idx_order_date ON orders(order_date);

 

Hash Join 최적화를 위해 Equal 조인 조건을 적절히 활용하고, 필요한 경우 인덱스를 생성하여 성능을 향상시킬 수 있습니다. 이를 통해 데이터베이스의 Join 작업을 더욱 효율적으로 처리할 수 있습니다.

 

❓• 참고

일반적으로 Hash Join은 Equal(=) 조인 조건을 기반으로 동작하는 알고리즘이기 때문에 Equal 조인이 없는 경우에는 Hash Join이 발생하지 않습니다. Hash Join은 하나의 테이블에서 해시 함수를 사용하여 해시 테이블을 만들고, 다른 테이블의 데이터를 해당 해시 테이블과 매칭시킵니다. 이 때, 해시 테이블을 만들기 위해서는 Equal 조인 조건이 필요합니다.

그러나 Equal 조인 조건이 없는 상황에서도 Hash Join이 발생하는 경우가 있습니다. 이는 특정 조건이 충족될 때 Hash Join을 다른 방식으로 구현하여 수행하는 경우입니다. 예를 들어, Oracle 데이터베이스에서는 "Partition-Wise Join"이라는 기능을 제공합니다. 이 기능은 큰 테이블을 여러 파티션으로 분할하고, 파티션 단위로 각각의 작은 테이블과 Hash Join을 수행하는 방식입니다. 이때, Equal 조인 조건이 없더라도 파티션 간의 Hash Join이 발생하여 전체적인 성능을 향상시킬 수 있습니다.

또한, 데이터베이스 벤더에 따라서는 조인 조건을 분석하여 자동으로 조인 알고리즘을 결정하는 경우도 있습니다. 이 경우에는 Equal 조인 조건이 없더라도 옵티마이저가 최적의 실행 계획을 찾기 위해 다른 Join 알고리즘을 선택하게 됩니다.

요약하면, 일반적으로 Hash Join은 Equal 조인 조건을 필요로 하며, Equal 조인이 없는 경우에는 Hash Join이 발생하지 않습니다. 그러나 특정 조건이나 데이터베이스의 기능에 따라서 Equal 조인이 없더라도 다른 방식으로 Hash Join이 발생하는 경우가 있을 수 있습니다.

 

 

목차
 

 

반응형

댓글