중첩 루프 조인 튜닝 실습
중첩 루프 조인 튜닝의 실습
개발자를 위한 오라클 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?