1. 연결고리 칼럼에 인덱스가 전혀 없는 경우에는 Nested Loops 조인은 좋은 성능을 내는가?
X : 연결고리 컬럼에 인덱스가 전혀 없으면 좋은 성능 불가능
2. Nested Loops 조인에서는 조인하는 테이블로부터 데이터를 동시에 각각 읽어 들이는가?
X : 드라이빙(Driving) 테이블로부터 데이터를 읽어 들일 때마다 드리븐(Driven) 테이블에 조인을 하여 데이터를 읽는다.
NESTED LOOPS JOIN은 두 테이블의 조인 횟수를 최소화 하는 것이 가장 큰 영향이 있음!
/*+ ORDERED USE_NL(a b) */ << ORDERED 문구 때문에 a가 먼저 읽는 테이블로 선택됨! USE_NL(a b) 문구로 NESTED LOOP가 되는 것!
NESTED LOOPS JOIN은 두 테이블의 조인 횟수를 최소화 하는 것이 가장 큰 영향이 있음!
위의 예시에서 보면 A가 Driving 테이블(먼저 읽는 테이블)인데 A의 로루 갯수 만큼 조인이 반복되게 된다.
NESTED LOOPS JOIN의 장단점
1. 인덱스에 대한 랜덤 액세스가 기반임. 대량의 데이터 처리 시에는 적합하지 않음.
2. Driving Table로는 테이블의 데이터가 적은 마스터 테이블 or where절 조건으로 row를 제어할 수 있어야 함!
3. Driven Table(연결되는 테이블)에는 조인을 위한 적절한 인덱스가 생성되야함!
조인 순서 제어 힌트
1. /*+ ORDERED */
FROM 절에 기술한 테이블 순서대로 제어
2. /*+ LEADING(TABLE명) */
힌트 내에 제시한 테이블이 드라이빙으로 채택됨.
3. 뷰(VIEW) 활용
4. 서프레싱(SUPPRESSING) 활용
5. FROM 절의 테이블 순서 변경(RBO만 해당)
위쪽 : TABLE_A와 TABLE_B가 모두 INDEX가 있을 때. 어떤 테이블이 DRIVING 되도 괜찮음
다만 아래쪽의 경우 TABLE_A만 인덱스가 있는데,
이때 TABLE_A가 DRIVING TABLE이 되면 TABLE_A 컬럼이 선택될 때 마다 TABLE_B가 FULL SCAN 되버린다.
그렇다면 둘다 INDEX가 없는 경우는?
DRIVEN 테이블에 대한 FULL SCAN 회수는 DRIVING 테이블로 부터 읽는 ROW 수 만큼이 되버림.
이때는 Sort Merge와 Hash 조인이 해법이라 한다. 이건 찾아봐야 겠다.
'DB > SQL튜닝' 카테고리의 다른 글
업무에 바로 쓰는 SQL튜닝 입문 - 7교시(SORT/MERGE/HASH 조인) (0) | 2022.09.27 |
---|---|
업무에 바로 쓰는 SQL튜닝 입문 - 6교시(NESTED LOOPS 조인) - 문제 (2) | 2022.09.27 |
업무에 바로 쓰는 SQL튜닝 입문 - 5교시(인덱스활용불가) - 문제 (0) | 2022.09.26 |
업무에 바로 쓰는 SQL튜닝 입문 - 5교시(인덱스활용불가) (0) | 2022.09.26 |
업무에 바로 쓰는 SQL튜닝 입문 - 4교시(결합인덱스) - 문제 (0) | 2022.09.25 |