조인 방법
쿼리에 조인이 포함되어 있을 경우에는 옵티마이저 또한 테이블 간에 조인 작업을 수행하게 된다.
옵티마이저는 Nested Loop Join, Sort Merge Join, Hash Join 등 세 가지 조인 방법(Join Method)을 사용하여 조인 작업을 수행하게 된다.
중첩 루프 조인(NLJ)
WHERE 절에 있는 조건에 따라 두 테이블에서 하나의 테이블을 기준으로 삼아 다른 하나의 테이블에 있는 데이터를 읽는 방식이다.
기준이 되는 테이블 => 드라이빙 테이블(Driving Table) 혹은 Outer Table
나머지하나의 테이블 => Inner Table
SELECT EMP.EMPLOYEE_ID, EMP.DEPARTMENT_ID, DEP.DEPARTMENT_NAME
FROM EMPLOYEES EMP, DEPARTMENTS DEP
WHERE EMP.DEPARTMENT_ID = DEP.DEPARTMENT_ID;
EMPLOYEES 테이블이 드라이빙 테이블이 되는데, 옵티마이저는 맨 먼저 EMPLOYEES 테이블의 한 로우를 읽어 해당 로우의 DEPARTMENT_ID 값을 찾고, 이 값을 기준으로 DEPARTMENTS 테이블에서 이와 같은 값을 가진 로우를 검색한다.
검색이 완료되면 다시 EMPLOYEES 테이블의 두 번째 로우를 읽고 DEPARTMENTS 테이블에서 데이터를 검색한다.
=> FOR 문 내에 FOR문이 있다고 생각하면 된다.
특징
- 첫 번째 로우를 받는 시간은 빠르지만, 전체 결과를 받기까지는 시간이 걸린다.
- NLJ는 메모리가 필요 없는 조인 방법으로 추가적인 메모리 비용이 들지 않는다.
- 어떤 테이블을 드라이빙 테이블로 선택하느냐가 중요하다. 전체적인 성능은 드라이빙 테이블에 있는 데이터가 몇 건인지가 관건이 되며, 드라이빙 테이블의 크기가 전체 쿼리를 수행함에 큰 영향을 미친다.
- NLJ 방식은 대부분 InnER 테이블 검색시 인덱스를 사용해서 검색이 수행되므로 Inner 테이블의 인덱스 효율이 좋아야 한다. 또한 드라이빙 테이블 검색 시에는 Full Table Scan 이나 Index Scan 방식을 사용한다.
- 적은 수의 로우를 검색하는 경우 NLJ를 사용한다.
- 일반적으로 조인조건에 '=' 연산자가 사용될 경우 옵티마이저는 NLJ를 선택하게 된다.
정렬 병합 조인(SMJ)
두 테이블을 각각 정렬(Sort)한 다음 조인조건에 맞는 건을 찾아 합치는(merge) 방식의 조인 방법이다. SMJ 는 NLJ와 다르게 드라이빙 테이블이 존재하지 않고, 두 테이블 모두 독립적으로 동등한 레벨에 있다.
특징
- 첫 번째 로우를 받는 시간은 느리지만, 전체 로우가 반환되는 시간은 빠르다. (두 테이블의 데이터를 각각 정렬 후 병합하므로, 정렬작업이 끝날 때까지는 어떤 로우도 반환되지 않기 때문)
- 정렬 작업을 위해 추가적인 메모리를 사용한다. 정렬 작업을 수행하면서 일정 값 이상의 메모리를 사용하게 되면 TEMP 테이블스페이스를 사용하게 되므로 디스크 I/O가 발생하게 된다. (SORT_AREA_SIZE 파라미터에 명시된 값 사용)
- NLJ 보다는 많은 양의 데이터를 처리할 때 유리하며,메모리만 사용해서 정렬 작업을 수행한다면 넓은 범위의 값을 검색하는데 유용한다.
- 두 테이블의 데이터를 각각 정렬하는 작업이 전체 성능에 영향을 많이 끼치게 된다. 따라서 SELECT 리스트에서 불필요한 컬럼은 제거해서 부하를 적게 해줘야 한다.
- 일반적으로 조인조건에 사용되는 연산자가 >, >=, <, <=와 같은 비동등 연산자가 사용될 경우 옵티마이저는 SMJ을 사용하게 된다.
두 테이블 중 WHERE 조건에 의해 필터링 된 로우수가 적은 테이블을 대상으로 해쉬 테이블을 만든 후에, 조인 조건에 따라 다른 하나의 테이블의 데이터를 검색하는 방법이다.
해쉬 테이블을 만든다는 것을 제외하면 NLJ.와 비슷하다. HJ 방법은 해시 테이블이 드라이빙 테이블이 되어 NLJ를 수행한다고 보면된다.
특징
- 해쉬 테이블의 대상이 되는 테이블을 NLJ처럼 드라이빙 테이블이라고도 하지만 빌드 테이블(build table)이라고도 한다.
- 해쉬 조인은 조인조건에 동증조건(=)이 사용되었을 때만 가능하다.
- 보통 반환되는 로우수가 적은 테이블과 이에 반해 반환되는 로우수가 상당히 많은 테이블을 조인 시 유리하다.
(참고서적 : 뇌를 자극하는 오라클 프로그래밍)
'데이터베이스 노트 > 데이터베이스' 카테고리의 다른 글
DBMS와 버퍼 (0) | 2018.10.05 |
---|---|
DBMS 아키텍처 (0) | 2018.10.05 |
SQL 튜닝 (접근경로) (0) | 2018.08.22 |
SQL 최적화 기본원리 (조인 수행 원리) (0) | 2018.08.22 |
SQL 최적화 기본원리 (인덱스) (0) | 2018.08.20 |