

- 가장 보편적으로 사용되는 조인 방식
- Driving table로 선정된 테이블로부터 WHERE 검색 조건을 만족하는 데이터를 걸러낸 후, 이 값들을 가지고 조인 대상 테이블을 반복적으로 검색하면서 결과값을 얻어내는 방식
- Driving table 선택에 따라 성능 차이가 발생. Driving table의 선택이 매우 중요
- 조인 조건으로 사용될 컬럼에 인덱스가 존재하는지 여부도 중요함
- Driving table의 데이터가 적은 것을 선택
- 온라인 처리에 유리하다(부분처리가 필요할 때)
- Hint : /*+ use_nl(테이블) */
세부진행 과정
SELECT D.DEPT_NAME, E.EMP_NO, E.EMP_NAME, E.SAL
FROM DEPT D, EMP E
WHERE D.DEPT_NO = E.DEPT_NO
AND D.DEPT_NO >= 30
AND E.SAL >= 1500
;
DEPT 테이블 예시)
| deptno | dname | loc |
|---|
| 10 | accounting | N.Y |
| 20 | research | dallas |
| 30 | sales | chicago |
| 40 | operations | boston |
- DEPT table(Driving table)에서 주어진 상수 조건을 만족
- 조건을 만족하는 첫번째 Row가 발견되면 Driving Table에 대한 조회가 임시 중단됨
- Driving Table에서 return된 row(30, sales)의 Join 조건 값을 대입하여 Inner Table을 조회
- 3번 단계의 SQL이 완료되면, 임시 중단되었던 Driving Table의 조회를 재개한다.
- 조건을 만족하는 Data가 발견되면 다시 Driving Table의 조회를 재개한다.
- Driving Table에서 return된 row(40, operations)에서 Join 조건의 값을 대입하여 Inner Table을 조회
- 6번 단계의 SQL이 완료되면, 임시 중단 되었던 Driving Table의 조회를 재개한다.
- Driving Table에서 더 이상 조건을 만족하는 Data가 없을 경우, Join Operation이 종료된다.
Nested Loop Join시 수행되는 내부 SQL 및 최적의 Index 구성
| 구분 | DEPT(Driving Table) | EMP (Inner Table) |
|---|
| 내부 SQL | SELECT DEPT_NO, DEPT_NAME FROM DEPT WHERE DEPT_NO >=30 | SELECT EMP_NO, EMP_NAME, SAL FROM EMP WHERE DEPT_NO = :var AND SAL >= 1500 (:var는 Driving Table(DEPT)에서 return된 결과) |
| 최적 Index | DPET_NO | DPET_NO + SAL |
특징
- 선행 집합의 처리 범위에 의해 처리량이 결정
- 주로 인덱스를 경유하며, 소량의 데이터 차리에 적합
- 조인의 방향에 따라 사용되는 인덱스가 달라짐