SQL튜닝 - Nested Loop Join

alsoj·2023년 9월 15일

SQL튜닝

목록 보기
4/7
post-thumbnail

  • 가장 보편적으로 사용되는 조인 방식
  • Driving table로 선정된 테이블로부터 WHERE 검색 조건을 만족하는 데이터를 걸러낸 후, 이 값들을 가지고 조인 대상 테이블을 반복적으로 검색하면서 결과값을 얻어내는 방식
  • Driving table 선택에 따라 성능 차이가 발생. Driving table의 선택이 매우 중요
  • 조인 조건으로 사용될 컬럼에 인덱스가 존재하는지 여부도 중요함
    • 위 예시 2번째 그림 참조
  • 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 --JOIN 조건
AND D.DEPT_NO >= 30  --DEPT에 대한 조건
AND E.SAL >= 1500  --EMP에 대한 조건
;

DEPT 테이블 예시)

deptnodnameloc
10accountingN.Y
20researchdallas
30saleschicago
40operationsboston
  1. DEPT table(Driving table)에서 주어진 상수 조건을 만족
  2. 조건을 만족하는 첫번째 Row가 발견되면 Driving Table에 대한 조회가 임시 중단됨
  3. Driving Table에서 return된 row(30, sales)의 Join 조건 값을 대입하여 Inner Table을 조회
  4. 3번 단계의 SQL이 완료되면, 임시 중단되었던 Driving Table의 조회를 재개한다.
  5. 조건을 만족하는 Data가 발견되면 다시 Driving Table의 조회를 재개한다.
  6. Driving Table에서 return된 row(40, operations)에서 Join 조건의 값을 대입하여 Inner Table을 조회
  7. 6번 단계의 SQL이 완료되면, 임시 중단 되었던 Driving Table의 조회를 재개한다.
  8. Driving Table에서 더 이상 조건을 만족하는 Data가 없을 경우, Join Operation이 종료된다.

Nested Loop Join시 수행되는 내부 SQL 및 최적의 Index 구성

구분DEPT(Driving Table)EMP (Inner Table)
내부 SQLSELECT 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된 결과)
최적 IndexDPET_NODPET_NO + SAL

특징

  • 선행 집합의 처리 범위에 의해 처리량이 결정
  • 주로 인덱스를 경유하며, 소량의 데이터 차리에 적합
  • 조인의 방향에 따라 사용되는 인덱스가 달라짐

0개의 댓글