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 |