2.2. 연결고리 상태가 조인에 미치는 영향

- 조인에서 연결고리란 테이블을 연결하는 조인 조건을 말한다. 연결고리에 인덱스가 있는지 여부에 따라 정상, 이상으로 구분한다.

2.2.1. 연결고리 정상

- 조인조건이 되는 속성에 대한 인덱스가 모두 존재하는 경우.

- 두 테이블 중 하나가 드라이빙 테이블이 될 수 있다.

- 어느 테이블이 드라이빙(driving) 테이블이 되더라도 드리븐(driven) 테이블의 인덱스를 사용한다.

가능한 1:M의 1쪽의 테이블을 드라이빙 테이블로 한다.

- 어느 테이블이 드라이빙 테이블이 되는가에 따라 속도가 큰 차이는 없지만 차이가 있을 수 있다.

(SQL예)

SELECT *

FROM TAB2 b, TAB1 a

WHERE a.key1=b.key2 AND b.col2 LIKE 'AB%' AND a.col1='10';

(가정)

(TAB1 :  a.col1='10'을 만족하는 범위는 5,000건)

|

(TAB2 :  b.col2 LIKE 'AB%'를 만족하는 데이터는 100건)

(처리예 1)

TAB1에서 10인 것을 찾는다 -> KEY2 인덱스와 연결 -> 결과 생성

TAB2에 KEY2+COL2 인덱스가 있다면 더 효율적이다.

(처리예 2)

TAB2에서 AB%를 찾는다 -> KEY1 인덱스와 연결 -> 결과 생성

(참고) TAB2를 먼저 처리하려면 /*+ ORDERED */ 힌트를 사용한다.

2.2.2. 한쪽 연결고리 이상

- 조인조건이 되는 속성에 대한 인덱스가 한쪽 테이블에만 존재하는 경우

- 인덱스가 없는 테이블을 드라이빙 테이블로 하거나, 소트머지 혹은 해시조인을 사용한다.

- 인덱스가 없는 테이블을 드라이빙 테이블로 하지만 아래 예처럼 비효율적인 경우가 있음을 알아야 한다.

(SQL예)

SELECT *

FROM TAB2 b, TAB1 a

WHERE a.key1=b.key2 AND a.col1='20';

(처리예)

TAB2 처리 -> KEY1 인덱스와 연결 -> 결과 생성

(참고) TAB1의 데이터를 줄일 수 있는 a.col='20'을 인덱스를 활용하지 못한다.

2.2.3. 양쪽 연결고리 이상

- 조인조건이 되는 속성에 대한 인덱스가 양쪽 테이블 모두 존재하지 않는 경우

- 소트머지 혹은 해시조인을 사용한다.