중첩 루프 조인 튜닝
SQL의 중첩 반복문
개발자를 위한 오라클 SQL 튜닝 내용에서 참고한 내용입니다.
Intro
중첩 루프 조인(Nested Loop Join)
Outer 테이블과 Inner 테이블
인라인 뷰
중첩 루프 조인 튜닝
중첩 루프 조인 튜닝 힌트
중첩 루프 조인
중첩 루프 조인(Nested Loop Join)
프로그래밍의 중첩 반복문과 같은 방식으로 동작하는 기법
중첩 루프 조인의 동작 방식
A라는 집합을 한건 한건 읽어가면서 해당 결과를 바탕으로 B 집합에서 데이터를 찾아가는 방식
데이터를 한건 한건씩 찾아가는 방식은 대용량 테이블을 중첩 루프 조인한다면 성능에 부하를 주게된다.
인덱스 스캔을 하여 대용량 테이블에서 성능적인 이점을 취해야 한다.
(테이블 랜덤 액세스 부하의 발생 -> 부분 범위 처리)
Outer 테이블과 Inner 테이블
Outer 테이블
중첩 루프 조인에서 가장 먼저 스캔하는 테이블을 말한다.
다른 용어로 Driving 테이블이라 한다.
스캔 건수가 적을수록 중첩 루프 조인에 유리하다.
Inner 테이블
중첩 루프 조인에서 두 번째로 스캔하는 테이블을 말한다.
다른 용어로 Driven 테이블이라 한다.
Inner 테이블은 Outer 테이블 보다 결과 건수가 많아야 중첩 루프 조인 시 유리하다.
주의사항
Inner 테이블을 스캔할 때 효율적인 인덱스 스캔을 하지 못한다면 Outer 테이블의 결과 건수만큼 Inner 테이블을 테이블 풀 스캔하여 DBMS 전체 시스템에 큰 부하를 주게 된다.
인라인 뷰
인라인 뷰(Inline View)
FROM 절 내에 소괄호 '()'로 감싸져 있는 SELECT문
인라인 뷰 내에 있는 SELECT 문의 결과는 마치 하나의 테이블과 같은 개념
인라인 뷰를 사용하는 경우 옵티마이저가 처리하는 2가지 방식
인라인 뷰의 집합을 메인 쿼리 테이블과 같은 레벨로 올라가도록 병합하는 것을 'View Merging' 이라 부른다.
인라인 뷰가 메인 쿼리로 올라가지 못하도록 막는 것을 'View No Merging' 이라 한다.
비용기반 옵티마이저 는 일반적으로 인라인 뷰를 'View Merging' 하여 메인 쿼리와 같은 레벨로 취급하는 특성이 있다.
이를 쿼리 변환이라 한다.
두 개의 테이블이 논리적으로 같은 레벨에 존재하면 옵티마이저는 더 많은 '접근 경로(Access Path)' 를 통해 다양한 실행 계획들을 비교하교 평가하게 되므로 최적의 실행 계획을 도출해 낼 수 있다.
중첩 루프 조인 튜닝
중첩 루프 조인 튜닝의 조건
Outer 테이블의 결과 집합이 작아야 한다.
Inner 테이블 스캔 시 반드시 효율적인 인덱스 스캔이 이루어져야 한다.
위 조건이 지켜지지 않는 모든 일련의 활동을 중첩 루프 조인 튜닝이라 한다.
중첩 루프 조인 튜닝 관련 힌트
LEADING
2개 이상의 테이블 조인 시 첫 번째로 스캔할 테이블을 지정하는 힌트
LEADING 힌트를 이용하여 선행 테이블을 지정, 어떤 조인 방식으로 동작할 지는 오라클의 옵티마이저가 정하게 된다.
USE_NL
중첩 루프 조인을 유도하는 힌트, 힌트의 인자값으로 Inner 테이블을 지정
LEADING 힌트를 통해 선행 테이블을 지정, USE_NL 힌트로 Inner 테이블을 지정하여 중첩 루프 조인 연산을 수행하도록 하는 기능
MERGE
인라인 뷰로 감사져 있는 SQL을 메인쿼리와 같은 레벨로 병합하는 역할하는 힌트
View Merging 함으로써 오라클의 옵티마이저는 더 많은 접근 경로를 갖게 된다.
MERGE 힌트를 사용함으로써 인라인 뷰를 View Merging하여 메인 테이블과 같은 레벨로 처리하도록 한다.
그 후 오라클 옵티마이저는 다양한 접근 경로로 도출하게 된다.
NO_MERGE
인라인 뷰로 감싸져 있는 SQL이 메인쿼리와 같은 레벨로 병합되는 것을 방지한다.
NO_Merging 됨으로써 인라인 뷰에 있는 SQL은 독립적으로 수행된다.
NO_MERGE 힌트를 사용함으로써 인라인 뷰가 독립적으로 수행되도록 한다.
인라인 뷰가 수행 완료되면 결과 집합을 메인 쿼리와 조인으로 처리하게 된다.
Last updated