중첩 루프 조인 수행의 가장 큰 특징은 아래와 같다.
● DRIVING 테이블
- 먼저 엑세스 하는 테이블
- 조건을 만족하는 데이터에 대해 한 번만 엑세스 하며 조인 조건을 상수로 제공받지 못함
● INNER 테이블
- 뒤에 엑세스하는 테이블
- DRIVING 테이블에 추출되는 데이터 건수만큼 반복 수행하며 조인 조건을 상수로 제공 받음
SELECT A.COL1, A.COL2, B.COL2, B.COL3
FROM TABLE_A A, TABLE_B B
WHERE A.COL1 = B.COL1
AND A.COL1 = '1234567890'
AND B.COL2 > TRUNC(SYSDATE - 10)
중첩 루프 조인의 성능은 아래와 같은 조건에 의해 결정
- INNER 테이블의 효과적인 엑세스
- DRIVING 테이블에서 추출되는 데이터 건수
- DRIVING 테이블의 효과적인 엑세스
① INNER 테이블의 효과적인 엑세스
- 중첩 루프 조인의 특징에서 INNER 테이블은 DRIVING 테이블에서 추출되는 데이터 건수만큼 반복 엑세스를 하기 때문에 INNER 테이블의 효과적인 엑세스가 제일 중요하다.
- INNER 테이블의 반복 엑세스를 최적화하기 위해서는 최적의 인덱스 구성이 필요하다.
- 위 예제의 경우에서는 B.COL1이 A 테이블로부터 상수값을 제공받기 때문에 구성할 수 인덱스는 B.COL1 + B.COL2 혹은 B.COL2 + B.COL1으로 구성할 수 있다. 다만 B.COL1은 점 조건, B.COL2는 선분 조건이므로 최적의 인덱스 구성은 B.COL1 + B.COL2로 구성해야 한다.
② DRIVING 테이블에서 추출되는 데이터 건수
- DRIVING 테이블에서 추출되는 건수만큼 INNER 테이블과 조인을 수행하기 때문에 DRIVING 테이블에서 추출되는 데이터 건수가 적을수록 성능을 보장한다.
③ DRIVING 테이블의 효과적인 엑세스
- DRIVING 테이블에 빠른 엑세스를 위해 인덱스 구성이 필요하다.
- TABLE A의 경우 A.COL1이 점 조건이므로 A.COL1에 인덱스를 구성해야 한다.
중첩 루프 조인의 경우 처리 범위가 가장 적은 테이블을 DRIVING 테이블로 지정해서 가장 먼저 엑세스되도록 하는 것이 중요하다. 그 다음에 INNER 테이블의 반복 엑세스를 최적하하기 위해 인덱스를 선정해야 하며, 마지막으로 DRIVING 테이블에 엑세스하기 위한 인덱스를 선정해야 한다.
SELECT /*+ ORDERED USE_NL(A, B) */
A.COL1, A.COL2, B.COL2, B.COL3
FROM TABLE_A A, TABLE_B B
WHERE A.COL1 = B.COL1
AND A.COL1 = '1234567890'
AND B.COL2 > TRUNC(SYSDATE - 10)
중첩 루프 조인의 실행 계획은 위와 같은 방법으로 제어한다.
- ORDERED : FROM 절의 순서대로 테이블에 엑세스 수행
- USE_NL(A, B) : A 테이블과 B 테이블을 중첩 루프 조인 방식으로 조인을 수행
- A : DRIVING 테이블
- B : INNER 테이블
#실행 계획 샘플
SELECT STATEMENT
NESTED LOOPS
TABLE ACCESS BY INDEX ROWID OF 'TABLE_A'
INDEX RANGE SCAN OF 'A.COL1_IDX'
TABLE ACCESS BY INDEX ROWID OF 'TABLE_B'
INDEX RANGE SCAN OF 'B.COL2_IDX'
[참고] 실행 계획으로 배우는 고성능 데이터베이스 튜닝
'프로그램 > DB' 카테고리의 다른 글
[튜닝] 소트 머지 조인 (0) | 2022.11.07 |
---|---|
[튜닝] 해쉬 조인 (USE_HASH) (0) | 2022.11.03 |
[ORACLE] 실수로 지운 데이터 조회 및 복구 (1) | 2022.09.26 |
[오라클] CONNECT BY LEVEL 을 이용한 특정 날짜 구간 조회 (0) | 2021.02.13 |
[Oracle] TRUNC 함수 (0) | 2012.10.30 |