404 not found

[SQL 성능 분석하기] NESTED LOOPS 조인 본문

SQL/SQL튜닝

[SQL 성능 분석하기] NESTED LOOPS 조인

슈뢰딩거의햄스터 2021. 7. 19. 20:46

NESTED LOOPS 조인

 

1. NESTED LOOPS JOIN

옵티마이저가 Driving Table(Outer Table)을 결정함

Driving Table이 아닌 테이블은 Driven Table(Inner Table)로 지정함

Driving Table의 각 row에 대해 이들이 추출될 떄마다 Driven Table의 연관된 모든 row를 조인에 의해 액세스

 

* 튜닝포인트

: 테이블 간 조인 횟수를 최소화할 수 있도록 Driving Table 선택 > 조인 순서 제어

: Driven Table의 연결고리 칼럼에 대한 인덱스 구성


2. NESTED LOOPS JOIN의 수행 절차

: 연결횟수는 Driving Table의 건수와 같다.

 

3. NESTED LOOPS JOIN의 장단점

: 인덱스에 의한 랜덤 액세스에 기반하고 있기 때문에 대량의 데이터 처리 시 적합하지 않음

: Driving Table로는 테이블의 데이터가 적은 마스터 테이블이거나, where절 조건으로 적절하게 row를 제어할 수 있는 것이여야함

: Driven Table에는 조인을 위한 적절한 인덱스가 생성되어 있어야함

 

4. DRIVING TABLE의 원리

A(2000건) > B(10건) > C : 4000회(A>B: 2000회 + B>C: 2000회)

C(1건) > B(10건) > A(2000건) : 11회(C>B: 1회 + B>A: 10회)

 

5. 조인 순서 제어 방법

- 조인 순서 제어를 위한 힌트 사용

/*+ORDERED*/ -- FROM절에 기술한 테이블 순서대로 제어
/*+LEADING(table명)*/ -- 힌트 내에 제시한 테이블이 드라이빙으로 채택됨

* ORDERED가 사용되면 LEADING 힌트는 무시됨

 

- 뷰 활용

 

- 서프레싱(Suppressing)활용

 

- FROM절의 테이블 순서 변경

  : RBO하에서 각 테이블에 대한 규칙이 동일할 때, FROM절로부터 멀리 있는 테이블부터 처리함

  : CBO에서 의미없음

 

6. 연결고리에 대한 인덱스

테이블 A,B모두 Index가 있는 경우

A -> B TABLE_A RANGE SCAN
TABLE_B INDEX SCAN
B -> A TABLE_B RANGE SCAN
TABLE_A INDEX SCAN

 

한쪽 테이블(A)에만 Index가 있는 경우

A -> B TABLE_A RANGE SCAN
TABLE_B FULL SCAN
B -> A TABLE_B FULL SCAN
TABLE_A INDEX SCAN

 

모두 연결고리에 대한 인덱스가 없는 경우

: Driven Table에 대한 FULL TABLE SCAN 횟수는 Driving Table로 부터 읽어 들이는 

row수 만큼이 됨

Comments