1. NL 조인의 기본 개념
- 중첩 반복문처럼 작동하는 조인 방식
- 드라이빙 테이블(Driving/Outer Table) → 먼저 액세스되는 테이블
- 드리븐 테이블(Driven/Inner Table) → 나중에 액세스되는 테이블
FOR EACH ROW in 드라이빙 테이블 -- 외부 루프
FOR EACH ROW in 드리븐 테이블 -- 내부 루프
IF 조인 조건 만족 THEN
결과 행 추가
END IF
END FOR
END FOR
NL 조인이 효율적인 경우
- 드라이빙 테이블이 소량의 데이터를 반환할 때
- 조인 조건에 적절한 인덱스가 있는 경우
- OLTP(OnLine Transaction Processing) 환경
- 부분범위 처리가 가능한 경우
NL 조인의 특징
장점:
- 첫 번째 row 가져오는 응답속도 빠름
- 인덱스를 잘 활용하면 빠른 조회 가능
- 조인 대상 건수가 적을 때 유리
단점:
- 드리븐 테이블을 반복 액세스
- 대용량 데이터 처리시 성능 저하
- 부적절한 인덱스시 성능 매우 저하
최적화를 위한 고려사항
1) 드라이빙 테이블 선정
- 조건절로 결과 건수가 줄어드는 테이블
- 조인 후 결과 건수가 작은 테이블
2) 인덱스 구성
드라이빙 테이블: WHERE 조건과 ORDER BY 고려
드리븐 테이블: 조인 조건 컬럼 위주
3) 조인 조건
- 적절한 조인 조건 필수
- 조인 컬럼에 대한 인덱스 중요
실제 예시
SELECT *
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.salary > 5000;
실행 과정:
1. employees 테이블에서 salary > 5000 조건으로 row 찾음
2. 찾은 각 row의 department_id로 departments 테이블 조회
3. 조인 조건 만족하는 결과 반환
성능 개선 방법
1) 적절한 인덱스 구성
- 드라이빙 테이블: WHERE 조건 컬럼
- 드리븐 테이블: 조인 컬럼
2) 드라이빙 테이블 선정
- 더 적은 결과를 반환하는 테이블을 드라이빙으로
3) 힌트 사용
- USE_NL
- LEADING
- NO_NLJ_BATCHING
4) 조인 컬럼 선정
- 적절한 조인 조건 구성
- 인덱스 활용 가능한 조건
주의사항
- 대용량 데이터 처리시 다른 조인 방식 고려
- 인덱스 구성이 부적절하면 성능 저하
- 드라이빙 테이블 선정이 중요
- 조인 조건 누락 주의
2. NL 조인의 효율적 사용을 위한 튜닝 전략
- 인덱스 활용
- 내부 테이블의 조인 조건 열에 인덱스를 추가하는 것이 매우 중요합니다.
- 인덱스를 사용하면 내부 테이블을 풀 스캔하지 않고 필요한 레코드만 빠르게 찾을 수 있기 때문에 성능이 크게 향상됩니다.
- 외부 테이블과 내부 테이블의 선택
- 외부 테이블은 작은 테이블로, 내부 테이블은 큰 테이블로 선택하는 것이 효율적입니다.
- 외부 테이블이 작을수록 반복 횟수가 줄어들어 성능이 개선됩니다.
- 필터 조건의 사전 적용
- 조인 전에 필터링할 조건이 있다면, 외부 테이블과 내부 테이블에 미리 적용하여 레코드 수를 줄입니다.
- 사전에 필터링하여 조인에 사용되는 데이터 양을 최소화하면 전체 처리 속도가 빨라집니다.
- 배치 사이즈 조정
- 배치를 사용하여 데이터 처리를 묶음 단위로 수행함으로써 I/O 비용을 줄일 수 있습니다.
- 이 방법은 특히 대규모 데이터 조인에서 유리합니다.
- 힌트 사용
- USE_NL 등의 힌트를 활용해 NL 조인을 명시적으로 강제할 수 있습니다.
- 그러나 힌트는 특정 상황에서 성능을 최적화할 때 사용하며, 필요하지 않은 경우 오히려 성능에 악영향을 줄 수 있어 신중히 사용해야 합니다.
- 조인 재작성
- 만약 NL 조인 방식이 비효율적이라면, 해시 조인이나 소트 머지 조인과 같은 다른 조인 방식을 고려할 수 있습니다.
- 특히 해시 조인은 테이블 크기가 크거나 메모리가 충분할 때 더 나은 성능을 발휘할 수 있습니다.