4. 조인 순서의 중요성
2011.03.30 07:39
04 조인 순서의 중요성
?
** 조인 순서에 따라 쿼리 수행 성능이 달라질 수 있다. **
고객 테이블 : 10만 고객 관리
납입방법 테이블 : 신용카드, 자동이체, 지로 세 종류의 납입방법을 관리
양쪽 모두 조인 컬럼에 인덱스를 가지고 있다고 가정한다.
Q) 어떤 테이블을 먼저 드라이빙하는 것이 유리할까?
SELECT /*+ USE_NL(A B) */ A.납입방법명, B.*
FROM 납입방법 A, 고객 B
WHERE B.납입방법코드 = A.납입방법코드
* 필터 조건이 없을 때
NL 조인에서는 무엇보다 RANDOM 액세스 발생량에 의해 성능이 좌우 된다.
CASE1) 고객 테이블을 먼저 드라이빙하는 경우 => 총 20만번의 RANDOM 액세스 발생
SELECT /*+ LEADING(B) USE_NL(A) */ A.납입방법명, B.* FROM 납입방법 A, 고객 B WHERE B.납입방법코드 = A.납입방법코드 CASE2) 납입방법 테이블을 먼저 드라이빙하는 경우 => 총 100,003만번의 RANDOM 액세스 발생 SELECT /*+ LEADING(A) USE_NL(B) */ A.납입방법명, B.* FROM 납입방법 A, 고객 B WHERE B.납입방법코드 = A.납입방법코드 결론 : 다른 필터 조건이 없는 상황에서는 작은 쪽 집합을 드라이빙하는 것이 유리하다. * 필터 조건이 없을 때 조건) 거주지역이 '부산' 인 고객만을 대상으로 조회할 때 부산지역 고객은 전체 중 10%에 해당하는 1만명 고객 테이블 거주지역 컬럼에 인덱스가 있다. CASE1) 고객 테이블을 먼저 드라이빙하는 경우 => 총 3만번의 RANDOM 액세스 발생
SELECT /*+ LEADING(B) USE_NL(A) */ A.납입방법명, B.* FROM 납입방법 A, 고객 B WHERE B.납입방법코드 = A.납입방법코드 AND B.거주지역 = '부산' CASE2) 납입방법 테이블을 먼저 드라이빙하는 경우 => 총 100,003만번의 RANDOM 액세스 발생 SELECT /*+ LEADING(A) USE_NL(B) */ A.납입방법명, B.* FROM 납입방법 A, 고객 B WHERE B.납입방법코드 = A.납입방법코드 AND B.거주지역 = '부산' => 고객 테이블 쪽으로 많은 액세스가 있었지만 거주지역 = '부산' 조건에 의해 90%가량이 버려지므로 비효율이 존재 => 인덱스에 '거주지역' 컬럼을 추가한 경우 : 총 10,003번의 RADNDOM 액세스 발생 결론 : 조인 조건 외에 필터 조건이 있을 때는 인덱스 구성에 따라 유,불리가 경정되며, 비효율이 없게끔 인덱스를 잘 구성해 주기만 한다면 역시 작은 쪽 집합을 드라이빙하는 것이 유리. * 소트 머지 조인과 해시 조인의 경우
소트 머지 조인 : 디스크소트가 발생할 정도의 큰 테이블을 포함할 때는 큰 테이블을 드라이빙하는 것이 좋다. 메모리소트방식으로 조인할 때는 작은 쪽 테이블을 드라이빙하는 것이 조금 더 빠르다.? 해시 조인 : HASH AREA에 BUILD INPUT을 모두 채울 수 있느냐가 관건이므로 두말할 것도 없이 작은 쪽 테이블을 드라이빙하는 것이 유리하다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
15 | 8. 고급 조인 테크닉-2 | 오라클잭 | 2011.04.05 | 12564 |
14 | 5. 카디널리티 | 오라클잭 | 2011.04.27 | 12922 |
13 | 6. IOT, 클러스터 테이블 활용 | 오예스 | 2011.02.26 | 15604 |
12 | 4. PQ_DISTRIBUTE 힌트 | 휘휘 | 2011.06.27 | 15620 |
11 | 1. 인덱스 구조 | 운영자 | 2011.03.30 | 15954 |
10 | 4. 통계정보 Ⅰ | 토시리 | 2011.04.25 | 16017 |
9 | 6. 히스토그램 | 오예스 | 2011.04.25 | 17415 |
8 | 4. 조건절 Pushing | 오예스 | 2011.05.31 | 17495 |
7 | 5. Outer 조인 | 휘휘 | 2011.03.28 | 17670 |
6 | 2. 인덱스 기본 원리 | balto | 2011.02.18 | 18848 |
5 | 6. 스칼라 서브쿼리를 이용한 조인 | balto | 2011.03.27 | 18959 |
4 | 1. Nested Loops 조인 | 오라클잭 | 2011.03.23 | 23031 |
3 | 5. 병렬 처리에 관한 기타 상식 [1] | balto | 2011.06.26 | 28162 |
2 | 1. 테이블 파티셔닝 | 오라클잭 | 2011.06.21 | 28274 |
1 | Front Page | 운영자 | 2011.02.16 | 114630 |