[DB] Nested loop join과 Index의 관계

반응형

Nested loop join과 Index의 관계

 DB를 다루다 보면 필연적으로 테이블 간의 조인을 하게 된다.

이 과정에서 Nested loop join을 사용하게 되는데

두 테이블 중 하나의 테이블에만 인덱스가 존재하고 하나의 테이블에는 인덱스가 없다면 

DB 옵티마이져는 어느 테이블로 드라이빙할까?

 

1. 인덱스가 있는 A 테이블에서 인덱스가 없는 B 테이블로? ( A  -> B )

2. 인덱스가 없는 B 테이블에서 인덱스가 있는 A 테이블로? ( B -> A )

 

답은 2번  인덱스가 없는 B 테이블에서 인덱스가 있는 A 테이블 순서로 join 하게 된다.

 

이유는 다음과 같다고 생각하면 된다고 한다. DB 옵티마이저가 항상 가장 효율적으로 동작한다고 생각하게 되면 

인덱스가 있는 A 테이블에서 인덱스로 검색된 값이 상수로 사용되고 기반으로 B 테이블을 검색하게 된다.

B 테이블에는 인덱스가 존재하지 않으므로 A에서 찾은 상수를 인덱스로 사용할 수 없어 테이블을 풀 스캔하게 된다

A에서 도출된 값 곱하기 B 테이블 전체라는 동작을 수행하게 되는 것이다.

반대의 경우라면 먼저 B 테이블을 모두 스캔하여 찾고자 하는 값들을 찾을 것이고 도출된 값이 상수로 사용되고 

인덱스가 존재하는 A 테이블에서 인덱스 값으로 검색하게 된다면 B 전체 곱하기 A 인덱스 값들로 

조인 비용이 적게 들어가게 된다고 한다.

 

DB 공부하면서 까먹지 말자고 적고 있는 내용이다. 사실과 다를 수도 있으니 댓글에 지적해 주면 감사하겠다.

 

 

반응형