172. 중첩 루프 조인 (NL Join, Nested Loop Join)

핵심 인사이트: NL Join은 프로그래밍의 이중 for 루프와 완벽하게 동일하다. 선행 테이블(Outer)의 각 행마다 후행 테이블(Inner)을 반복 탐색하므로, 선행 테이블의 크기가 작고 후행 테이블에 인덱스가 있을 때 최고의 성능을 발휘한다.

Ⅰ. 중첩 루프 조인 (NL Join)의 개념

중첩 루프 조인은 두 개의 테이블을 조인할 때, 하나의 테이블(선행 테이블, Driving Table)에서 먼저 조건을 만족하는 행을 찾고, 그 행의 조인 키 값을 이용해 다른 테이블(후행 테이블, Driven Table)을 순차적으로 탐색하며 조인하는 방식입니다.

  • 온라인 트랜잭션 처리(OLTP) 환경에서 소량의 데이터를 빠르게 응답해야 할 때 가장 널리 사용됩니다.

Ⅱ. NL Join의 동작 원리 및 구조

NL Join은 이중 루프 구조로 동작합니다.

┌───────────────────────────────────────────┐
│ FOR each row R1 in Driving_Table (Outer)  │
│   IF R1 satisfies filter_condition THEN   │
│     FOR each row R2 in Driven_Table (Inner)│
│       IF R1.join_key = R2.join_key THEN   │
│         RETURN (R1, R2)                   │
│       END IF                              │
│     END FOR                               │
│   END IF                                  │
│ END FOR                                   │
└───────────────────────────────────────────┘
  1. 선행 테이블 (Driving Table) 결정: 옵티마이저가 처리 범위를 최소화할 수 있는 테이블을 선행 테이블로 선택합니다.
  2. 후행 테이블 (Driven Table) 탐색: 선행 테이블에서 추출된 각 행에 대해 후행 테이블을 탐색합니다. 이때 후행 테이블의 조인 컬럼에는 반드시 인덱스가 있어야 성능이 보장됩니다.

Ⅲ. NL Join의 장단점 및 특징

구분설명
장점- 메모리 소모가 적다. (별도의 해시 테이블이나 정렬 작업 불필요)
- 조건에 맞는 첫 번째 조인 결과를 즉시(Fast Response) 반환할 수 있다.
단점- 대량의 데이터를 조인할 때는 후행 테이블에 대한 반복적인 Random I/O가 발생하여 성능이 급격히 저하된다.
핵심 조건- 후행 테이블의 조인 컬럼에 적절한 인덱스가 존재해야 한다.
- 선행 테이블의 추출 건수가 적어야 한다.

Ⅳ. 성능 최적화 (Tuning) 포인트

  1. 올바른 Driving Table 선택: WHERE 절의 필터링 조건(Selectivity)이 좋아 추출되는 데이터 건수가 가장 적은 테이블을 선행 테이블로 선택해야 합니다.
  2. Driven Table 인덱스 구성: 후행 테이블의 조인 키에 인덱스가 없으면 매번 Table Full Scan이 발생하므로 치명적입니다.

📢 섹션 요약 비유: 전화번호부(선행 테이블)에서 '김씨'를 한 명 찾을 때마다, 주소록(후행 테이블)의 색인(인덱스)을 뒤져서 주소를 매칭하는 작업과 같습니다. 김씨가 3명이면 색인을 3번 찾으면 되지만, 1만 명이라면 1만 번 색인을 찾아야 하니 무척 힘들어집니다.