매주 각 스터디 팀원들이 담당 분량을 정리해서 올리고 토론식으로 진행합니다.
스터디 포스팅은 팀원들에의해 이루어지지만 스터디 참여는 사이트 회원 모두가 가능합니다.
진행기간: 2009.07 ~ 2009.10. 종료
2.2. 연결고리 상태가 조인에 미치는 영향
2009.09.05 14:55
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. 양쪽 연결고리 이상
- 조인조건이 되는 속성에 대한 인덱스가 양쪽 테이블 모두 존재하지 않는 경우
- 소트머지 혹은 해시조인을 사용한다.