메뉴 건너뛰기

bysql.net

이화식 선생님의 새로쓴 대용량 데이터 베이스 1의 온라인 스터디 입니다.
매주 각 스터디 팀원들이 담당 분량을 정리해서 올리고 토론식으로 진행합니다.
스터디 포스팅은 팀원들에의해 이루어지지만 스터디 참여는 사이트 회원 모두가 가능합니다.

진행기간: 2009.07 ~ 2009.10. 종료

 

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. 양쪽 연결고리 이상

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

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