[데이터베이스] 조인기법
NL 조인 (Nested Loop)
사용힌트 : +use_nl(table)
방식
기본적인 루프방식의 조인으로, 프로그래밍의 반복문과 동일하게 조인하는 방식.
for (i=0;i<100;i++){ -- 선행테이블(outer loop)
for(j=0;j<100;j++){ -- 후행테이블(inner loop)
- 주어진 조건에 따라 선행테이블 조회
- 조인키값으로 후행테이블의 데이터를 조회하여 조인
}
}
장점
한 레코드씩 조인을 진행한다. => 즉각적으로 결과를 보여주기에 좋다.
단점
랜덤액세스 위주의 방식이다. => 대량데이터 처리에 안좋음.
동작예시
1. EMP(PK_EMP) index scan : 5 블록 -> 100 rows
2. EMP table access (rowid) : 100 rows
3. DEPT(PK_DEPT) index scan : 100번 조인
4. DEPT table access (rowid) : 5 rows
=> 이 경우 A는 인덱스를 이용해 100개의 rowid를 찾았고, 이 rowid로 테이블엑세스를 통해 필터링 제외건 없이 100개의 row를 찾았기 때문에 아주 효율적임. B와 조인을 100번 시도했으나, 필터링된 데이터는 5 row 뿐이므로, 순서변경을 고려.
Sorted Merge 조인
사용힌트: +user_merge(table)
방식
Sort와 Merge 두가지 단계로 동작함.
1. Sort : 양쪽 집합을 조인 컬럼 기준 정렬하여 PGA에 저장.
2. Merge : 정렬한 양쪽 집합을 merge.
장점
1. 데이터를 '일괄적으로' 일거 PGA에 두고 사용하는 점에서 NL조인보다 빠르다.
= 랜덤액세스 부하가 없다.
2. 인덱스가 없어도 사용할 수 있다.
단점
1. PGA가 부족할 경우 디스크(Temp) 공간을 사용하게 되어 성능이 저하될 수 있다.
동작예시
1. A,B 테이블 각각 정렬한 내용을 PGA의 Sort Area 에 저장한다. 이 공간이 부족하면 디스크(Temp) 공간을 사용한다.
2. 정렬된 A테이블을 스캔하며 정렬된 B 테이블과 조인한다.
Hash 조인
사용힌트: +use_hash(table)
랜덤액세스
한번에 하나의 블록에 액세스 하는 싱글블록 I/O 방식
TABLE FULL SCAN의 경우 여러개의 블록에 액세스하는 멀티블록 I/O를 사용
참고
친절한 SQL 튜닝