1. NESTED LOOPS JOIN (NL Join)

- 옵티마이저가 Driving Table을 결정함. (Outer Table)
- Driving Table이 아닌 테이블은 Drvien Table로 지정함 (Inner Table)
- Driving Table의 각 row에 대해 이들이 추출될 때마다 Driven Table의 연관된 모든 row를 조인에 의해 엑세스

 

* NESTED LOOPS JOIN의 튜닝포인트
① 테이블 간 조인 횟수를 최소화 할 수 있도록 Driving Table을 구성 -> 조인 순서 제어
② Driven Table의 연결고리 칼럼에 대한 인덱스 구성
(연결되는 테이블은 인덱스가 있어야 효율적으로 쿼리 실행이 가능함)

* NESTED LOOPS JOIN의 특징
① 인덱스에 의한 랜덤 엑세스에 기반하고 있기 때문에 대량의 데이터 처리 시 적합하지 않음. (테이블 간의 조인 횟수 최소화를 위한 조인 순서의 최적화)
② Driving Table로는 테이블의 데이터가 적은 마스터 테이블이거나, where절 조건으로 적절하게 row를 제어할 수 있는 것이어야 함
③ Driven Table에는 조인을 위한 적절한 인덱스가 생성되어 있어야 한다.


2. NESTED LOOPS JOIN의 수행 절차

ex) joinkey_a, joinkey_b, color, size 등은 모두 인덱스임
SELECT /*+ORDERED USE_NL(a b)*/
a.color, ... , b.size, ...
FROM table_a a, table_b b
WHEREE a.joinkey_a = b.joinkey_b
AND a.color = 'RED'
AND b.size = 'MED'
;
힌트(a b) 구문을 통해 table a를 먼저 읽고(driving table),  USE_NL로 인해 NESTED LOOPS를 사용해 table b를 읽어온다. 연결고리 칼럼 joinkey_b에 인덱스가 존재하므로 효율적으로 쿼리가 실행된다,


3. NESTED LOOPS JOIN 장단점
*장점 
① 인덱스를 통한 랜덤 엑세스(random access) 기반에서 좋은 성능을 보인다.
*단점

① 인덱스가 없는 상태에선 속도가 저하됨
② 대용량 데이터를 처리할 경우 성능이 저하됨.


4. DRVING TABLE의 원리

위 그림과 같이, 여러 번의 NL Join을 진행할 경우, 데이터가 적은 테이블부터 NL Join을 진행하는 것이 효율적.

 


5. 조인 순서 제어 방법

① 힌트로 아래와 같이 순서를 제어 
/*+ORDERED */
-> FROM 절에 기술한 테이블 순서대로 제어
/*+LEADING(table명) */
-> 힌트 내에 제시한 테이블이 Driving Table으로 채택됨
(ORDERED 힌트와 같이 사용할 경우 LEADING 힌트는 무시됨)

② 뷰(view) 활용
③ suppressing 활용
④ FROM 절의 테이블 순서 변경
(RBO 에서는 각 테이블에 대한 규칙이 동일할 때, FROM 절로부터 멀리 있는 테이블부터 처리함, CBO에서는 이 방법이 의미가 없다.)

 


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

① 양 쪽 모두 인덱스가 있는 경우
- 두 테이블 중 조회되는 결과가 적은 테이블을 선택하여 driving table로 선택
② 한쪽만 인덱스가 있는 경우
- 인덱스가 없는 쪽 테이블을 driving table로 사용함.
③ 양쪽 모두 연결고리에 대한 인덱스가 없는 경우
ex)  SELECT *
       FROM TAB_A A, TAB_B B
        WHERE A.NAME = B.NAME;
A -> B 이던, B -> A이던 Full table scan으로 간다.

driven 테이블에 대한 Full table scan 회수는 driving 테이블로부터 읽어 들이는 row 수만큼 된다.

이러한 상황에서 할 수 있는 조인이 Sort Merge와 Hash조인, Nested Loops 조인방식으로 조인이 이뤄지지 않는다.

'IT > SQL' 카테고리의 다른 글

Cartesian Product  (0) 2023.07.25
SORT/MERGE JOIN과 HASH JOIN  (0) 2023.07.24
인덱스 활용이 불가능한 경우  (0) 2023.07.23
결합 인덱스(Composite Index)  (0) 2023.07.19
인덱스(Index)  (0) 2023.07.15

+ Recent posts