Join의 종류
1. Nested Loop Join
2. Sort Merge Join
3. Hash Join
Nested Loop Join
select e.ename, d.dname
from emp e, dept d
where e.deptno = d.deptno;
SQL 실행 순서
1) emp T 메모리에 복사
2) emp T에서 ename 꺼내서 임시 작업 공간으로 가져감
3) dept T에서 해당 deptno를 찾으러 가는데 where 절을 보고 해당 조건에 맞는 데이터를 찾아 dname을 가져옴
4) 한 행의 작업이 끝나면 다시 emp T로가서 두번째 행의 이름을 PGA(메모리 영역)로 가져옴
5) 다시 dept T로 가서 두번째 deptno와 동일한 deptno를 가진 dname을 꺼내옴
먼저 읽은 테이블의 행의 수만큼 join 됨 => from절의 테이블 순서가 중요함
Driving Table(선행 테이블), Driven Table(후행 테이블)
Sort-Merge Join
select e.ename, d.dname
from emp e, dept d
where e.deptno = d.deptno;
SQL 실행 순서
1) emp T의 ename을 가져오고 이를 통해 dept T의 dname의 값을 찾음
where 절의 조건을 기준으로 정렬(Sort) -> 조건에 맞는 dname을 비교해 값을 가져옴
인덱스가 존재하면 해당 T 전부 읽지 않고 데이터를 찾은 후 T로 가서 바로 데이터 읽기 가능
인덱스가 없을 경우에도 빨리 해당 데이터를 찾아서 결과를 출력해야하는 경우에 Sort-Merge join 방법 사용
단점 : Sort할때 시간이 오래 걸림, where 절에 잘못된 조건 주면(or 안 주면) 올바른 데이터 못 가져옴
Hash Join
select e.ename, d.dname
from emp e, dept d
where e.deptno = d.deptno;
양쪽 테이블 모두 join 칼럼에 인덱스가 없을 때 사용
1) 두 테이블 중 범위가 좁은 테이블을 메모리로 가져옴
2) join 조건의 칼럼의 데이터를 hash 함수에 넣어서 나온 hash value로 hash T 생성
3) 후행 테이블의 join 조건을 hash 함수에 넣어 hash value 생성, 이 값을 선행 T의 hash T의 값과 비교해 같은 값 찾아 매칭
Hash Join과 Sort-Merge는 둘다 모든 테이블을 다 읽는데,
Sort-Merge Join에서 정렬을 실행하지 않는다.
그래서 성능이 2배가 차이난다.
출처 : [오라클] Join 원리, 개념 파악하기(loop join, sort_merge join, hash join) :: 개발/일상_Mr.lee (tistory.com)
댓글