중첩 루프 조인 튜닝 실습

중첩 루프 조인 튜닝의 실습

개발자를 위한 오라클 SQL 튜닝 내용에서 참고한 내용입니다.

Intro

  • 기반 데이터

    • 고객 정보 10만건 생성

    • 주문 정보가 100만건 생성

  • 주문일자 + 주문이름에 대한 복합 인덱스를 생성

  • 쿼리 테스트

    • LEADING 힌트로 고객 테이블을 Driving 테이블로 설정

    • USE_NL 힌트로 주문정보 테이블을 Driven 테이블로 설정

    • 조인 조건에 대한 인덱스가 없는 경우에 대한 테이블 풀 스캔 동작 테스트

  • 튜닝 쿼리 테스트

    • Outer 테이블에 CUST_NM 컬럼으로 구성된 인덱스 추가

      • LEADING 힌트를 통해 고객 정보 테이블을 Driving 테이블로 설정

      • INDEX 힌트를 통해 고객이름에 대한 인덱스 스캔하도록 설정

    • Inner 테이블에 CUST_ID + ORD_DT 컬럼으로 구성된 복합 인덱스 생성

      • USE_NL 힌트를 통해 중첩 루프 조인을 유도, 주문정보 테이블을 Inner 테이블로 지정

      • INDEX 힌트를 통해 고객 ID + 주문일자 인덱스를 스캔하도록 설정

    • Outer 테이블인 고객정보 테이블의 스캔 건수만큼 Inner 테이블의 주문정보 테이블을 스캔 시 효율적인 인덱스 스캔을 하도록 유도하여 성능 향상을 확인

실습 테이블 생성 및 데이터 등록

  • 인덱스 구성

    • 주문 정보 테이블에 '주문일자 + 주문이름'으로 구성된 복합 인덱스를 생성

  • 통계 정보

중첩 루프 조인 (테이블 풀 스캔)

  • SQL 분석

    • LEADING 힌트를 사용하여 고객 테이블을 Outer 테이블로 설정

    • USE_NL 힌트를 사용하여 주문정보 테이블과 중첩 루프 조인이 이루어지도록 설정

    • 고객테이블과 주문정보 테이블을 고객아이디 컬럼을 기준으로 '=' 조인

    • 주문정보 테이블은 고객아이디를 선두 컬럼으로 한 인덱스가 존재하지 않으므로 주문정보 테이블은 테이블 풀 스캔으로 처리된다.

  • SQL의 문제점

    • 주문정보 테이블에 고객 아이디를 선두 컬럼으로 구성된 인덱스가 존재하지 않는다.

    • 고객 정보 테이블의 결과 집합의 건수만큼 주문정보 테이블에 테이블 풀 스캔을 하게 된다.

  • Execute plan

    • TB_CUST 테이블을 테이블 풀 스캔한다.

    • TB_ORD 테이블을 테이블 풀 스캔한다.

    • TB_CUST 테이블과 TB_ORD 테이블을 중첩 루프 조인(NESTED LOOPS)한다.

      • 즉, TB_CUST 결과 집합의 건수만큼 TB_ORD 테이블을 테이블 풀 스캔하게 된다.

    • 조건 절에 조건에 따른 필터링 처리를 한다.

    • SELECT 절의 연산을 수행

튜닝 전 테이블 풀 스캔 실행 계획

중첩 루프 조인 (인덱스 스캔 튜닝)

  • SQL 분석

    • LEADING 힌트를 사용하여 고객 테이블을 Outer테이블로 지정

    • INDEX 힌트를 사용하여 고객명에 대한 인덱스를 스캔하도록 지정

    • USE_NL 힌트를 이용하여 중첩 루프 조인을 유도, 주문 테이블을 Inner 테이블로 지정

    • INDEX 힌트를 사용하여 고객아이디 + 주문일자 인덱스를 스캔

    • 고객 테이블의 스캔 건수만큼 Inner 테이블인 주문정보 테이블을 스캔 시 효율적인 인덱스 스캔으로 성능 향상을 예상할 수 있다.

중첩 루프 조인 인덱스 스캔 실행 계획

Last updated

Was this helpful?