[ 실행계획 - join ]
1. 정의
. 두 개 이상의 테이블을 마치 하나의 테이블처럼 만들기 위해 연결
2. Sort Merge Join
- 동시적(무조건 전체범위처리). 전체 데이터를 리턴받는 시간이 Nested-Loop보다 빠르다.
- 추가적인 sort메모리 비용이 필요하다. 메모리 공간이 부족하다면 temp tablespace를 사용하게 됨.
- Sort 메모리에 위치하는 대상은 Join key뿐만 아니라 select list도 포함하므로 불필요한 select list는 제거해야 한다.
- Sort를 요구하지 않는 경우는 Hash Join이 유리하다.
- 독립적(자기의 처리범위만으로 처리량 결정)
- 스캔(Scan)액세스 위주
- 연결고리 상태에 영향이 없음
- 주로 넓은범위 처리에 유리
장단점
단점 - 두 결과 집합의 크기가 많이 차이나는 경우에는 SORT Merge Join이 비효율적
어느 한쪽이라도 정렬 작업이 종료되지 않으면 조인이 시작될 수 없으므로
두 테이블 조인 집합의 크기가 많이 차이가 난다면 한쪽에 '대기' 상태가 발생하여
비효율적으로 처리가 된다. 이렇게 크기가 비슷하지 않은 집합의 조인을 위해서
HASH 조인을 사용할 수 있다.
- Sort Merge Join 수행 예제
. DEPT 를 읽어서 정렬
EMP 를 읽어서 정렬
WHERE 조건인 DEPTNO 를 기준으로 서로 MERGE
> 위 2가지를 수행하므로 SORT MERGE JOIN이라고 함
- 특징두 테이블을 모두 읽고 각각 정렬
두 테이블간에 비교(WHERE 조건을 기준으로)
3. Nested LOOP JOIN
- Nested LOOP Join 수행하면 좋은 경우
. 조인 조건 컬럼에 인덱스가 없는 경우
. 조인 조건 컬럼에 Data type이 다른 경우
. 주로 랜덤 엑세스에 유리
. 부분 범위처리 가능 (즉, 먼저 검색된 레코드를 먼저 join시킴)
. 연결 고리 상태에 따라 성능 차이가 많이 발생
. Drving table 지정시 ordering hint 사용하면 좋다.
- 중첩 Loop join (프로그램으로는 이중 for 문으로 생각하면 됨)
- 수행 방법 예제
. 두개의 테이블간 JOIN을 수행 할 경우
첫번째 테이블의 레코드 결과가 3개 존재 할 경우(PK값 A, B, C)
첫번째 레코드 A값을 가진 레코드를 두번째 테이블과 JOIN하고
두번째 레코드 B값을 가진 레코드를 두번째 테이블과 JOIN하고
세번째 레코드 C값을 가진 레코드를 두번째 테이블과 JOIN 한다.
> 이와 같이 하나의 레코드별로 반복 JOIN 수행 됨
> Driving Table에 결과가 많을 경우 반복Join (Loop join)이 많이 수행되어 속도가 느리다.
. Driving Table이 적은 결과 갯수일 수록 성능이 좋음
- 조회
. DEPT 를 먼저 읽고 EMP 를 나중에 읽음
(예전에는 FROM 앞쪽부터 먼저 읽었지만 CBO로 넘어 오면서 뒤쪽부터 읽음)
.
- FROM 앞쪽부터 테이블을 읽게 하려면 (hint ORDERED)
. PLAN
4. Hash Join
- Hash Join 수행하면 좋은 경우
.
- Hash Join 수행 예제
. 기존에 존재 하는 index들 모두 제거
. index가 없는 상태에서 join
. dept, emp를 Table full scan 후 서로 Hash Join함
.
- HASH JOIN은 HASH기법을 이용하여 조인을 수행
조인 칼럼을 기준으로 HASH FUNCTION를 수행하여 서로 동일한 HASH VALUE을
갖는 것들 사이에서 실제 값이 같은지를 비교하면서 주인을 수행
- NL Join랜덤 액세스와 SortMerge Join의 문제점인 정렬 작업의 부담을
해결하기 위한 대안으로 등장
- Hash Join은 조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있는 기법
- Hash Join은 해쉬 함수를 이용하여 조인을 수행하기 때문에 = 로 수행하는
join, 동등조건에서만 사용할 수 있다.
- Hash Join을 할 때는 결과 행의 수가적은 테이블을 Driving Table로 사용하는 것이 좋다.
- 현재 가능 좋은 성능
> 선행테이블에서 자료를 추출 후 hash 값을 만들어서 SGA 영역에 올려놓고
후행테이블에서 자료를 추출 후 hash 값을 만들어서 SGA 영역에 올려놓은 후
서로 JOIN을 수행하여 결과 조회
(이 Hash값을 만들어서 join하는 방법은 oracle의 노하우다)
5. OUTER JOIN
. 단점
- OUTER JOIN이 걸려 있는 테이블은 FULL SCAN하는 경우가 존재
(차후 레코드가 많아지면 수행속도가 아주 느려진다.)
> 예) SELECT * FROM 고객 C, 주문 O
WHERE C.고객NO(+) = O.고객NO;
. 특징
- 처리 방향이 한쪽으로 고정
- Outer(+)기호가 붙지 않은 테이블이 항상 Driving table로 선택
- READING힌트를 넣어도 순서가 바뀌지 않음
'(DB) Oracle 튜닝 > 쌍용튜닝교육' 카테고리의 다른 글
Oracle 기본 내용 (0) | 2018.02.20 |
---|---|
Oracle - db link (0) | 2018.02.10 |
자주 사용하는 SQL (0) | 2018.02.10 |
Oracle- Clustered Table (0) | 2018.02.10 |
DB 튜닝. hint 목록 (0) | 2018.01.27 |