정미나닷컴
[Oracle] 오라클 JOIN 순서의 중요성 본문
NL JOIN
- Random access 발생량에 의해 성능이 좌우
-- 고객의 총 수는 10만 명, 납입 방법은 세가지
-- 두 테이블 모두 JOIN 컬럼에 인덱스를 갖고 있다고 가정
- 필터 조건이 없는 경우
SELECT /*+ use_nl (a b) */ A.납입방법, B.*
FROM 납입방법 A, 고객 B
WHERE B.납입방법코드 = A.납입방법코드;
- 드라이빙 테이블 : 고객 T /*+ leading(b) use_nl(a) */
▶ 10만번 + 10만번 = 총 20만번의 Random access
- 드라이빙 테이블 : 납입 T /*+ leading(a) use_nl(b) */
▶ 3번 + 10만번 = 총 10만 3번의 Random access
* 다른 필터 조건이 없는 상황에서는 작은 쪽(=1쪽) 집합을 드라이빙하는 것이 유리
- 필터 조건이 있는 경우
-- 부산지역 고객은 1만명, 고객 테이블 거주지역 컬럼에 인덱스가 있다고 가정
SELECT /*+ use_nl (a b) */ A.납입방법, B.*
FROM 납입방법 A, 고객 B
WHERE B.납입방법코드 = A.납입방법코드
AND B.거주지역 = '부산';
- 드라이빙 테이블 : 고객 T /*+ leading(b) use_nl(a) */
▶ 1만번 + 1만번 + 1만번 = 총 3만번의 Random access
- 드라이빙 테이블 : 납입 T /*+ leading(a) use_nl(b) */
▶ 3번 + 10만번 = 총 10만 3번의 Random access (필터 조건에 의해 90% 가량의 데이터가 버려지는 비효율)
- 납입방법코드 인덱스에 거주지역 컬럼을 추가
▶ 3번 + 1만번 = 총 1만 3번의 Random access
* JOIN 조건 외에 필터 조건이 있을 때는 인덱스 구성에 따라 유·불리가 결정
인덱스 구성이 잘 된 경우 작은 쪽(=1쪽) 집합을 드라이빙하는 것이 유리
Sort Merge JOIN
- PGA상에 정렬된 집합을 통해 JOIN access가 일어나기 때문에 Random access 발생량보다는 Sort 부하에 의해 성능이 결정
- 디스크 소트(to-disk sort)가 발생할 정도의 큰 테이블을 포함할 때는 큰 테이블을 드라이빙하는 것이 유리
- 메모리 소트(in-memory sort) 방식으로 JOIN할 때는 작은 쪽 테이블을 드라이빙 하는 것이 유리
Hash JOIN
- Hash Area에 Build Input을 모두 채울 수 있느냐가 관건이므로 무조건 작은 쪽 테이블을 드라이빙하는 것이 유리
'IT' 카테고리의 다른 글
[Oracle] 오라클 JOIN을 내포한 DML 튜닝 (0) | 2017.10.29 |
---|---|
[Oracle] 오라클 스칼라 서브쿼리를 이용한 JOIN (1) | 2017.10.29 |
[Oracle] 오라클 인덱스 설계 (0) | 2017.10.26 |
[Oracle] 오라클 인덱스 구조 - Bitmap Index, 비트맵 인덱스 (0) | 2017.10.22 |
[Oracle] 오라클 HWM (High Water Mark) (0) | 2017.10.22 |