드라이빙 테이블(or OUTER TABLE)이란, JOIN먼저 선택되는 테이블을 의미한다.

반대로, 나중에 엑세스되는 테이블을 드리븐 테이블(or INNER TABLE)이라 한다.

아래 예시를 보면, 어떤 테이블이 먼저 엑세스 되는지에 따라 큰 차이가 발생할 수 있다.

- TableA : 1000건
- TableB : 100건
- 테이블의 관계가 1:1일 경우
  1. TableA가 드라이빙 테이블 일 경우
  2. TableB가 드라이빙 테이블 일 경우

이처럼, 기본적으로 작업 대상이 되는 행의 수가 적은 테이블이 먼저 엑세스 되어야 전체 일의 양이 줄어들게 된다.

1. 결정 규칙

옵티마이저는 규칙기반/비용기반으로 나뉜다.

대부분 사용되고 있는 비용기반 옵티마이저의 결정 방식을 살펴보자.

SELECT * 
FROM tableA a, tableB b
WHERE a.temp_no = b.temp_no;

(1) b.temp_no에 인덱스가 존재하는 경우

만약, tableB를 드라이빙 테이블로 선택한다면, tableB의 레코드 수만큼 tableA를 Full Scan 해야하므로 성능 저하가 발생할 것이다.

tableB 테이블에는 인덱스가 존재하므로, Full Scan을 막을 수 있기 때문에 tableA를 드라이빙 테이블로 선택하고, 인덱스가 있는 tableB를 드리븐 테이블로 선택한다.

(2) a.temp_no에 인덱스가 존재하는 경우

“(1)”와 마찬가지로 tableA 테이블의 반복되는 Full Scan을 막기 위해 tableB를 드라이빙 테이블로, tableA를 드리븐 테이블로 선택한다.