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 | 7. 비용 | balto | 2011.05.02 | 5004 |
14 | 3. 병렬 조인 | 오예스 | 2011.06.29 | 4969 |
13 | 11. 집합 연산을 조인으로 변환 | 오라클잭 | 2011.06.08 | 4956 |
12 | 5. 인덱스를 이용한 소트 연산 대체 | AskZZang | 2011.06.16 | 4955 |
11 | 2. 소트를 발생시키는 오퍼레이션 | balto | 2011.06.12 | 4847 |
10 | 5장. 소트 튜닝 | balto | 2011.06.16 | 4283 |
9 | 6. Sort Area를 적게 사용하도록 SQL 작성 | 오예스 | 2011.06.14 | 4209 |
8 | 3. 옵티마이저의 한계 - P | 휘휘 | 2011.04.18 | 3699 |
7 | 2장. 조인 원리와 활용 | 운영자 | 2011.03.23 | 3308 |
6 | 12. 기타 쿼리 변환 | 휘휘 | 2011.06.06 | 3122 |
5 | 4. 소트가 발생하지 않도록 SQL 작성 | AskZZang | 2011.06.16 | 3109 |
4 | 3. 데이터 모델 측면에서의 검토 | AskZZang | 2011.06.16 | 2724 |
3 | 4장._쿼리_변환 | 휘휘 | 2011.09.07 | 2394 |
2 | 진행기록 | 운영자 | 2011.08.23 | 2383 |
1 | 2. 서브쿼리 Unnesting | 토시리 | 2011.05.18 | 2080 |