본문 바로가기

Hash Join 예시

by ㅇㅍㅍ 2023. 7. 27.
Hash Join 예시
728x90

Hash Join을 설명하기 위해 emp와 dept 테이블을 사용하여 실행 계획을 보여드리겠습니다. 예를 들어, emp 테이블은 사원 정보를 담고 있고, dept 테이블은 부서 정보를 담고 있다고 가정해봅시다.

 

EMP 테이블 구조:

emp_id | emp_name | dept_id | salary
-----------------------------------
1      | Alice    | 101     | 50000
2      | Bob      | 102     | 60000
3      | Carol    | 101     | 55000
4      | David    | 103     | 45000
5      | Eve      | 102     | 52000

 

DEPT 테이블 구조:

dept_id | dept_name
-------------------
101     | HR
102     | Finance
103     | IT

 


 

이제 EMP와 DEPT 테이블을 Nested Loop Join을 사용하여 조인해보겠습니다.

 

쿼리:

SELECT emp.emp_name, dept.dept_name
FROM emp
JOIN dept ON emp.dept_id = dept.dept_id;

 

실행계획:

------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%)|
------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |   105 |     5  |
|   1 |  HASH JOIN         |      |     5 |   105 |     5  |
|   2 |   TABLE ACCESS FULL| EMP  |     5 |    75 |     2  |
|   3 |   TABLE ACCESS FULL| DEPT |     3 |    21 |     2  |
------------------------------------------------------------

 

실행 계획 해석:

  • HASH JOIN을 사용하여 조인이 수행됩니다.
  • 먼저 EMP 테이블과 DEPT 테이블의 전체 행을 스캔하기 위해 각각 TABLE ACCESS FULL을 사용합니다.
  • 그런 다음, 두 테이블의 조인 조건에 해당하는 열을 해시 함수를 사용하여 해시 테이블을 만듭니다.
  • 최종적으로 해시 테이블을 사용하여 조인 결과를 생성합니다.

 

동작 방식:

  • Hash Join은 두 테이블을 각각 전체 스캔하여 해시 테이블을 만들고, 해시 테이블을 사용하여 조인을 수행합니다.
  • 해시 테이블을 사용하여 두 테이블의 조인 조건에 해당하는 데이터를 빠르게 찾을 수 있기 때문에 성능이 우수합니다.

Hash Join은 큰 테이블과 작은 테이블 사이에서 조인을 수행할 때 성능이 뛰어나며, 두 테이블의 크기가 비슷할 때도 효율적입니다. 이 예시에서는 dept 테이블이 작은 테이블이므로 dept 테이블을 드라이빙 테이블로 선택하여 Hash Join을 수행합니다. 이렇게 함으로써 두 테이블의 데이터를 빠르게 조합하여 조인 결과를 생성할 수 있습니다.

 

"드라이빙 테이블"은 여러 개의 테이블을 조인할 때, 조인을 시작하는 기준이 되는 테이블을 가리키는 용어입니다.

 

💡 Tip!

일반적으로 Hash Join은 인덱스를 타지 않고 전체 테이블을 스캔하는 것이 성능상 유리할 수 있습니다.

Hash Join은 큰 테이블과 작은 테이블 사이에서 조인을 수행할 때 효과적인 알고리즘입니다. 작은 테이블을 해시 테이블로 만들고, 큰 테이블의 각 행을 해시 함수를 사용하여 해시 테이블에서 조인할 데이터를 검색하는 방식으로 동작합니다.

인덱스를 타는 경우에는 인덱스 블록을 읽고, 해당 블록에 대응하는 데이터 블록을 찾아서 데이터를 가져오는 추가적인 I/O 작업이 발생합니다. 이러한 인덱스 탐색 작업은 비용이 크기 때문에 큰 테이블에 대해 수행하는 경우에는 인덱스를 타는 것보다 전체 테이블을 스캔하는 것이 더 빠를 수 있습니다.

또한 Hash Join은 두 테이블 간에 해시 함수를 사용하여 조인 조건에 해당하는 데이터를 매우 빠르게 찾을 수 있기 때문에 인덱스를 타지 않아도 효율적으로 조인을 수행할 수 있습니다.

하지만 데이터의 분포나 인덱스 상태에 따라서 성능이 달라질 수 있으므로, 어떤 경우에는 인덱스를 사용하는 것이 유리할 수도 있습니다. 따라서 데이터베이스 옵티마이저가 최적의 실행 계획을 선택하도록 하거나, 필요에 따라 테스트하여 성능을 비교하는 것이 중요합니다. 데이터베이스 시스템은 각 쿼리에 대해 다양한 실행 계획을 고려하여 최적의 조인 방법을 선택하므로, 개발자나 DBA는 인덱스를 생성하는 등의 성능 튜닝을 신중하게 수행해야 합니다.

 

 

목차
 

 

반응형

댓글