NL 조인은 기본적으로 이중 중첩 루프문
SELECT /*+ no_nlj_batching(B) */ *
FROM EMP A,CLIENT B
WHERE A.EMPNO = B.CLNO
AND A.HIREDATE > '20200101';
(1) SELECT * FROM A WHERE A.date>'20110101'의 조회를 수행하면서 해당 엔티티가 존재하면 A.id를 가짐
(2) SELECT * FROM B WHERE B.id = N( (1)에서 조회한 A.id )
위와 같은 방식으로 조회를 수행하게 된다.
때문에 2번 수행의 경우 인덱스 스캔을 하지 않는다면 A테이블에서 조건을 만족하는 엔티티 만큼 B를 테이블 스캔하게 되므로 반드시 내부테이블은 인덱스 스캔을 수행해야 한다.
A 테이블을 outer table
B 테이블을 inner table 이라고 부른다.
EMP(PK : EMPNO , DATE)
CLIENT (PK : CLNO , DATE)
위와 같을시에 (CLIENT 가 prefetch 되어서 table access가 먼저 실행됨) 실행계획을 보면 EMP테이블에서 조회를 수행하면서 -> Client 테이블에서 조회를 다시 수행하는것을 볼 수 있다.
* no_nlj_batching 힌트를 빼면
아래와 같은 실행계획이 동작하는데 이는 Inner쪽 테이블에서 batch IO가 작동 할 수도 있음을 나타낸다.
만약 모든 데이터가 버퍼에 캐시되어 있다면 batch IO, Prefetch 기능은 해당기능을 사용 안하는것과 성능에 차이가 없다.
'C.S > DB' 카테고리의 다른 글
Oracle 파티션 테이블과 파티션 인덱스 (INSERT 튜닝) (0) | 2022.07.06 |
---|---|
Oracle 파티션 테이블과 파티션 인덱스 (DELETE 튜닝) (0) | 2022.07.06 |
Oracle 파티션 테이블과 파티션 인덱스 (UPDATE 튜닝) (0) | 2022.07.06 |
Oracle 파티션 테이블과 파티션 인덱스 (0) | 2022.07.05 |
DataBase 정규화 (0) | 2021.02.28 |