4.1 NL 조인(Nested Loop JOIN)
- NL조인은 인덱스를 이용한 조인이라 튜닝 원리도 그대로 적용할 수 있음
- NL조인을 정확히 이해하고 나면 다른 조인 방시기도 쉽게 이해할 수 있음
4.1.1 기본 메커니즘
- SQL이 탄생하기 전까진 두 테이블을 조인하는 프로그램을 개발자가 직접 작성해야만 했다
- 조인 조건(ex. 사원번호)이 일치하는 레코드를 찾기 위해 Nested Loop(중첩 루프문)을 사용하여 만족하는 레코드를 찾음
- 일반적으로 NL조인은 양쪽 테이블의 인덱스를 모두 이용
- Outer쪽 테이블은 사이즈가 크지 않으면 인덱스를 이용하지 않을 수 있음
- NL조인 스캔 과정 p258~259 그림을 통해 알기 쉽게 설명되어져 있음
4.1.2 NL조인 실행계획 제어
- 각 테이블을 액세스할 때 인덱스를 이용한다는 사실도 실행계획에서 알 수 있음 (p260)
- NL조인 제어 힌트
- ordered 힌트는 FROM 절에 기술한 순서대로 조인하라고 옵티마이저에 지시할 때 사용
- use_nl 힌트는 NL방식으로 조인하라고 지시할 때 사용
- leading힌트는 FROM절을 바꾸지 않고 조인 순서를 제어할 수 있음
4.1.3 NL 조인 수행 과정 분석
- 힌트와 실행계획에 따라 조건절 순서를 제대로 나열
- 각 단계를 모두 완료하고 다음 단계를 넘어가는 게 아니라 한 레코드씩 순차적으로 스캔 진행
4.1.4 NL 조인 튜닝 포인트
- 첫 번째 튜닝 포인트는 사원_X1 인덱스를 읽고 나서 사원 테이블을 액세스 하는 부분
- 만약 사원 테이블로 아주 많은 양의 랜덤 액세스가 발생했고, 테이블에 부서코드로 필터링 되는 비율이 높다면?
- → 인덱스에 부서코드 추가하는 방안 고려
- 랜덤액세스(테이블 액세스 양 자체를 줄임, 인덱스 단계에서 액세스 양을 줄임)
- 두 번째 튜닝 포인트는 고객_X1 인덱스를 탐색하는 부분
- 조인 액세스 횟수가 많을수록 성능이 느려짐
- 조인 액세스 횟수는 Outer 테이블인 사원을 읽고 필터링한 결과 건수에 의해 결정된다.
- 세 번째 튜닝 포인트는 고객_X1 인덱스를 읽고 나서 고객 테이블을 액세스하는 부분
- 여기서도 최종주문금액 ≥2000 조건에 의해 필터링되는 비율이 높다면 고객_X1 인덱스에 최종주문금액 컬럼을 추가하는 방안을 고려해야 함
- 네 번째, 맨 처음 액세스하는 사원_X1 인덱스에서 얻은 결과 건수에 의해 전체 일량이 좌우된다
- 사원_X1 인덱스를 스캔하면서 추출한 레코드가 많으면, 사원 테이블로 랜덤 액세스하는 횟수, 고객_X1 인덱스를 탐색하는 횟수, 고객테이블로 랜덤 액세스하는 횟수가 많아짐
올바른 조인 메소드 선택