본문 바로가기

Nested Loop Join 예시

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

Nested Loop 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 (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |   105 |     7   (0)| 00:00:01 |       |       |
|   1 |  NESTED LOOPS      |      |     5 |   105 |     7   (0)| 00:00:01 |       |       |
|   2 |   TABLE ACCESS FULL| EMP  |     5 |    75 |     2   (0)| 00:00:01 |       |       |
|*  3 |   INDEX UNIQUE SCAN| DEPT |     1 |     5 |     0   (0)| 00:00:01 |       |       |
-----------------------------------------------------------------------------------

 

실행 계획 해석:

  • NESTED LOOPS를 사용하여 조인이 수행됩니다.
  • 먼저 EMP 테이블을 읽어오기 위해 TABLE ACCESS FULL을 사용합니다. 이는 EMP 테이블의 모든 행을 스캔하는 것을 의미합니다.
  • 그리고 DEPT 테이블에서 DEPT_ID를 조회하기 위해 INDEX UNIQUE SCAN을 사용합니다. 이 인덱스 스캔을 통해 DEPT 테이블에서 조인 조건을 만족하는 부서 정보를 빠르게 찾습니다.
  • NESTED LOOPS는 이 두 결과를 조합하여 조인 결과를 만들어냅니다.

 

동작 방식:

  • Nested Loop Join은 EMP 테이블의 모든 행을 처음부터 끝까지 읽으면서, 각각의 행에 대해 DEPT_ID를 사용하여 DEPT 테이블에서 일치하는 부서 정보를 찾습니다.
  • 이러한 과정을 모든 EMP 테이블의 행에 대해 반복하며, 조인 조건을 만족하는 경우 조인 결과를 생성합니다.

Nested Loop Join은 두 테이블 중 작은 테이블을 드라이빙 테이블로 선택하여, 작은 테이블의 각 행마다 다른 테이블을 순차적으로 탐색하는 방식으로 조인을 수행합니다. 이 예시에서는 emp 테이블이 작은 테이블이기 때문에 emp 테이블을 드라이빙 테이블로 선택합니다. 이러한 방식으로 조인을 수행하면 성능이 좋지만, 큰 테이블을 기준으로 조인해야 할 경우 비효율적일 수 있습니다.

 

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

 

💡 Tip!

Nested Loop Join을 사용하기로 확정한 경우에는 두 번째로 읽는 테이블인 DEPT에 INDEX가 존재하는지 확인하고, 없다면 INDEX를 생성하는 것이 성능 개선에 도움이 될 수 있습니다.

만약 DEPT 테이블의 dept_id 열에 인덱스가 존재하지 않는다면, Nested Loop Join을 수행할 때마다 전체 DEPT 테이블을 스캔하여 일치하는 데이터를 찾아야 합니다. 이는 대량의 데이터가 있는 경우에는 비효율적이며, 성능에 영향을 줄 수 있습니다.

 

 

목차
 

 

반응형

댓글