정미나닷컴

[Oracle] 오라클 JOIN 순서의 중요성 본문

IT

[Oracle] 오라클 JOIN 순서의 중요성

정미나 2017. 10. 29. 11:25

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을 모두 채울 수 있느냐가 관건이므로 무조건 작은 쪽 테이블을 드라이빙하는 것이 유리