NL 조인

이재철·2021년 10월 2일
0

SQL

목록 보기
8/11

NL조인

  • 인덱스를 이용한 조인 방식
  • Outer와 Inner 양쪽 테이블 모두 인덱스를 이용
  • Outer쪽 테이블은 사이즈가 크지 않으면 인덱스를 이용하지 않을 수 있다.
  • Inner 쪽 테이블은 인덱스를 사용해야 한다.

NL 조인 실행계획 제어

  • ordered 힌트 : From 절에 기술한 순서대로 조인하라고 옵티마이저에 지시할 때 사용
  • use_nl 힌트 : NL 방식으로 조인하라고 지시할 때 사용

NL 조인 수행 과정 분석

  • 각 단계를 모두 완료하고 다음 단계로 넘어가는게 아니라 한 레코드씩 순차적으로 진행한다

NL 조인 튜닝 포인트

  1. 사원_X1 인덱스를 읽고 나서 사원 테이블을 액세스하는 부분
    • 사원_X1 인덱스에 부서코드 컬럼을 추가하는 방안을 고려
  2. 고객_X1 인덱스를 탐색하는 부분
    • 고객_X1 인덱스를 탐색하는 횟수, 즉 조인 낵세스 횟수가 많을수록 성능이 느려진다.
  3. 고객_X1 인덱스를 읽고 나서 고객 테이블을 액세스하는 부분
  4. 맨 처음 액세스하는 사원_X1 인덱스에서 얻은 결과 건수에 의해 전체 일량이 좌우된다는 사실도 기억하자
  • 올바른 조인 메소드 선택
    • 일차적으로 NL 조인부터 고려하는 것이 올바른 순서
    • 성능이 느리다면, NL 조인 튜닝 포인트에 따라 각 단계의 수행 일량을 분석해서 과도한 랜덤 액세스가 발생하는 지점을 우선 파악한다.

NL 조인 특징 요약

  1. 레코드 하나를 읽으려고 블록을 통째로 읽는 랜덤 액세스 위주의 조인 방식
  2. 한 레코드씩 순차적으로 진행 -> 아무리 큰 테이블을 조인하더라도 매우 빠른 응답 속도를 낼 수 있음
  3. 다른 조인 방식과 비교할 때 인덱스 구성 전략이 특히 중요
  • NL 조인은 소량 데이터를 주로 처리하거나 부분범위 처리가 가능한 온라인 트랜잭션 처리 시스템에 적합한 조인 방식

NL 조인 확장 매커니즘

오라클은 NL 조인 성능을 높이기 위해 테이블 Prefetch, 배치 I/O기능을 도입
(2 방식 모두 읽는 블록 마다 건건 I/O call 발생을 막기 위한 방법)
1. 테이블 Prefetch : 인덱스를 이용해 테이블을 액세스하다가 디스크 I/O가 필요해 질 때 이어서 읽게 될 블록 까지 미리 읽어 버퍼캐시에 적재하는 기능
(힌트 : nlj_prefetch / no_nlj_prefetch)
2. 배치 I/O : 디스크 I/O call을 미뤘다가 읽을 블록이 일정량 쌓이면 한꺼번에 처리
(힌트 : nlj_batching, no_nlj_batching)

  • 11g 부터 NL 조인 Inner 쪽 테이블에 작동하는 배치 I/O 기능도 결과집합의 정렬 순서를 보장하지 않는다.
  • 11g에서 바깥쪽 메인 쿼리에 ORDER BY를 추가했어도 안쪽 ORDER BY를 함부로 제거해선 안된다.

0개의 댓글