본문 바로가기

Oracle DB

조인의 원리 및 활용

 

1. Nested Loop 조인

- Random Access 위주의 조인방식 -> Index 필수!

- 조인을 한 레코드씩 순차적으로 진행

- 대용량 처리시 치명적 한계점 발생 -> 좁은 범위에서만 쓰임 -> OLTP 환경에 적합

- 인덱스 구성 전략이 매우 중요!

 

 

2. Sort merge 조인

- 소트 단계 : 양쪽 집합을 조인 컬럼 기준으로 정렬

- 머지 단계 : 정렬된 양쪽 집합을 merge

- 조인을 위해 실시간으로 인덱스를 생성하는 것과 같은 효과

- 양쪽 집합을 정렬 후 NL조인과 같은 방식으로 진행하지만, PGA 영역에서 처리 -> 빠름!

- 소트 부하만 감수한다면 버퍼 캐시에서 조인하는 NL조인 보다 유리

- 조인 컬럼에 인덱스 유무와 상관없이 조인

- 사용하는 경우 : Firtst 테이블에 소트 연산을 대체할 인덱스가 있을 때, 조인할 First 집합이 이미 정렬되어 있을 때, 조인 조건식이 등치 조건이 아닐 때

 

 

3. Hash Join

- Build Input Table -(Hash Fuction)-> Hash Area <-(Hash Fuction)- Probe Input

- S G A P G A

- 두 개의 테이블 중 작은 집합을 읽어 Hash Area에 적재 (Build Input)

- 반대쪽 큰 집합을 읽어 해시 테이블을 탐색 (Probe Input)

- 해시테이블을 탐색할 때 해시 함수를 사용

- 등치조건만 사용 가능!

-> NL 조인처럼 Random 액세스 부하 없으며 소트머지처럼 소트 부하도 없음.

- 단, Build Input이 Hash Area 크기 안에 들어가는 것이 성능의 성패를 좌우

- 해시 조인은 래치 획득과정이 없는 PGA에서 처리해서 빠른 탐색과정

 

 

- 사용 기준

1. 한쪽 테이블이 Hash Area에 담길 정도로 충분히 작아야 함

2. Build Input 해시 키 컬럼에 중복 값이 거의 없어야 함 -> Hash Chain(경로)이 길어짐

3. 조인 컬럼에 적당한 인덱스가 없어 NL조인이 비효율적일 때

4. NL 조인시 액세스 량이 많아 Random 액세스 부하가 심할 때

5. 소트머지 조인을 하기엔 두 테이블이 너무 커서 소트 부하가 심할 때

6. 수행빈도가 낮고 수행시간이 오래 걸리는 대용량 테이블을 조회할 때

-> 수행빈도가 높고 OLTP 에선 사용 불가. CPU와 메모리 사용률이 크게 증가!

 

 

● Hash 조인 관련 힌트

- SWAP_JOIN_INPUTS(Table Name) -> Build Input으로 사용

- NO_SWAP_JOIN_INPUTS(Table Name) -> Probe Input으로 사용

 

 

 

4. 조인 순서의 중요성

- NL 조인시에는 Driving 테이블의 인덱스 결과 값이 작아야하거나 쓰이는 컬럼이 인덱스에 모두 존재하면 됨

- Sort Merge 조인시 Disk sort가 필요한 경우 큰 테이블 Driving이 유리 (Disk I/O 감소)

PGA Sort Area안에 담길 경우 적은 테이블 Driving이 유리 (Join 회수 감소)

- Hash 조인은 Hash Area에 충분히 담길 정도로 적은 테이블이 Build Input으로 쓰여야 하며 Hash Chain이 작아야함

 

 

5. Outer Join

 

1) Outer NL Join

- (+)의 반대쪽이 드라이빙 테이블로 선택

- Leading 힌트로도 순서 변경 불가능 (논리적 모순)

 

 

2) Outer Sort Merge Join

- (+)의 반대 쪽이 드라이빙 테이블로 선택

- Leading 힌트로도 순서 변경 불가능 (논리적 모순)

 

 

3) Outer Hash Join

- (+)의 반대쪽이 드라이빙 테이블로 선택 -> 10g 부터는 Right Outer 해시 조인 가능

- SWAP_JOIN_INPUTS(Table Name)으로 순서 조정 가능

 

 

6. 스칼라 서브쿼리를 이용한 조인

- Scalar Sub Query 란 Select 절에 쓰이는 Sub Query

- 수행 회수 최소화를 위한 캐싱 기능을 제공한다

 

 

7. 조인을 내포한 DML 튜닝

- bypass_ujvc 힌트를 이용 -> Updatable Join View로, 1:M 관계에서 M쪽만 변경

-> 수정 가능 뷰 체크를 생략

- DBMS는 확인 불가능 해도 사람에게 Check를 넘기는 힌트.

- 반드시 Update를 위해 참조하는 집합에 중복 레코드가 없을 때만 사용 필요

* 11g 에서만 사용이 불가능하며 Merge Into Table1 Using Table2 형식으로 사용

 

'Oracle DB' 카테고리의 다른 글

계층쿼리 / 선분이력 끊기 / 데이터 복제를 통한 소계  (0) 2021.04.03
윈도우 함수  (0) 2021.04.03
인덱스 구조 및 이해(2)  (0) 2021.04.03
인덱스 구조 및 종류의 이해(1)  (0) 2021.04.03
SQL 파싱 부하  (0) 2021.04.03