C.S/DB

Oracle NL조인

칼쵸쵸 2022. 10. 10. 23:11

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 기능은 해당기능을 사용 안하는것과 성능에 차이가 없다.