[참고] http://dbrang.tistory.com/tag/JOIN
http://scidb.tistory.com/118
- 선행테이블 == Driving 테이블 == 바깥테이블 (outer)
- 후행테이블 == Driven 테이블 == 안쪽테이블 (inner)
예)
select *
from tcafe a, tcafe_member b
where a.cafeno = b.cafeno;
실행계획)
select statement optimizer=ALL_ROWS
-hash join
-- table access (full) 'tcafe' (table)
-- table access (full) 'tcafe_member' (table)
풀이)
tcafe, tcafe_member 의 위치 / cafeno 조인조건의 순서와 상관없이
tcafe 먼저 driving 하고 tcafe_member 를 driven 하고 있음.
하나의 커뮤니티(tcafe)에 여러 멤버(tcafe_member)가 존재함.
위 상황은 옵티마이저가 결정한다.
( 힌트를 통해 개발자가 제어도 가능하다 )
Hash Join의 특징 )
ㅇ선행 테이블이 해쉬 테이블로 사용된다.
ㅇ선행 테이블은 후행 테이블이 처리 되기 전에 완전히 모두 읽혀진다.(hash join의 특징)
ㅇ작은 테이블이 바깥 테이블로 사용된다.(작은 테이블 우선)
ㅇNo order is preserved(hash join 특징으로 필요시 Order by를 해줘야 한다.)
ㅇ선행 테이블이 커지면 해시 버켓으로 인해 메모리 사용량은 늘어난다.
ㅇ인덱스는 사용되지 않는다. 따라서 임의성 쿼리에 탁월한 성능 발휘.(hash index생성)
ㅇ자주 나타나면 인덱스가 없거나 상당히 큰 테이블에 유효하다.
예)
select *
from tcafe_member b, tcafe a
where b.cafeno = a.cafeno
and a.cafeno = 2471;
실행계획)
- NESTED LOOPS
-- TABLE ACCESS(BY INDEX ROWID) OF TCAFE
---INDEX(UNIQUE SCAN) OF 'PK_CAFE
-- TABLE ACCESS(BY INDEX ROWID) OF TCAFE_MEMBER
---INDEX(UNIQUE SCAN) OF 'FK_CAFE_MEMBER01'
풀이)
Nested Loop Join
ㅇ선행 테이블의 일치하는 모든 행을 후행 테이블에서 반복하여 찾는다.
ㅇ후행 테이블에 인덱스가 있으면 최상(인덱스 없는 놈을 나중에 쓴다.)
ㅇ선행 테이블의 처리 결과를 후행 테이블에서 받아 필터링하기에 선행 테이블이 전체 일의 양이다.
ㅇ후행 테이블의 필터링 조건은 선행 테이블에서 나온 결과에 대한 추가 필터링 역할만 한다.
ㅇ메모리 사용량 적다.
ㅇ어느 테이블이 먼저 사용? 크기와 상관 없다.(필터링된 양이 적은 테이블이 선행되는게 좋겠지..)
ㅇ필요하다면 선행 테이블을 정렬하고 조인된다.
ㅇ양이 적은 경우에 유효하다.
ㅇRanddom I/O가 많이 발생할 수 있다.
ㅇCPU(Random I/O에 의한 ↑), I/O (↓), Memory (?)
'DEV > DB' 카테고리의 다른 글
MSSQL 기본 정리 (0) | 2011.01.13 |
---|---|
MSSQL의 속도가 너무 느릴때 NVARCHAR로 형변환할 때 jeus설정 (0) | 2010.11.10 |
[ibatis] resultType 참거짓 (0) | 2010.11.04 |