시그마 삽질==six 시그마

'친절한 SQL 튜닝' 요약정리 4탄: 조인 튜닝(NL조인) 본문

프로그래밍/Database

'친절한 SQL 튜닝' 요약정리 4탄: 조인 튜닝(NL조인)

Ethan Matthew Hunt 2020. 3. 19. 22:23
(주)디비안 조시형 대표님의  '친절한 SQL 튜닝의 바이블'  

구입하시길 강력 추천드립니다.

책 구입을 원하시는분은 요기를 클릭하시면 됩니다.

-저자 소개
現) 주식회사 디비안 대표이사 
오라클 성능 고도화 원리와 해법 1, 2 저자 
국가공인 SQLP, DAP 자격검정 전문위원
한국데이터진흥원과 한국DB산업협의회가 공동 주관하는 제1회 우수DB人상을 수상
인터넷 카페 디비안 포럼(WWW.DBIAN.NET) 운영
前) 이랜드, 인슈넷, 디엠에스랩, 엔코아, 비투엔


하단의 내용은 제가 예전에 읽었던 내용을 요약 정리한 것입니다.

 

 

4.1 NL조인

 

Nested Loop 조인 중첩루프문

 

select e.사원명, c.고객명,c.전화번호

from 사원 e, 고객 c

where e.입사일자 >= “19960101’

and c.관리사원번호=e.사원번호

 

Outer 쪽 테이블은(사원) 사이즈가 크지 않으면 인덱스를  이용하지 않을 수 있음

table full scan 하더라도 그것은 한번에 그치기 때문

반면 inner쪽 테이블은(고객) 인덱스를 이용하지 않으면 outer 루프에서 읽은 건수만큼 table full scan을 반복

 

사원table

사원번호|사원명|입사일자

 

고객테이블

고객번호|고객명|전화번호|관리사원번호

 

1.사원 인덱스(입사일자)에서 입사일자>=19910101’인 첫번째 레코드  찾음->2.인덱스에세서 읽은 rowid로 사원 테이블 레코드 찾아감 ->3. 사원테이블에서 읽은 사원번호 ‘0006’로 고객 인덱스(고객번호)를 탐색 ->4. 고객 인덱스에서 읽은 rowid로 고객 테이블 레코드를 찾아감. 5. 관리사원번호가 0006 아닐때까지 3,4번 반복. 없으면 다시 1번으로 와서 입사일자에 맞는 두번째 레코드를 읽음 

for outer  for inner (inner 조건 맞는거 다 하고  다시 outer로 넘어감.)

 

select /*+order_use_nl(B) use_nl(C) use_hash(D) */*

from A,B,C,D where…

해석해보면 A->B->C->D 순으로 조인하되 B와 조인할 때 그리고 이어서 C와 조인할때는 NL방식으로 조인하고 D와 조인할때는 해시 방식으로 조인하라는 뜻

 

select e.사원번호, e.사원명, e.입사일자 ,c.고객번호 , c.고객명, c.전화번호, c.최종주문금액

from 사원 e, 고객 c

where c.관리사원번호=e.사원번호

and e.입사일자 >=’19960101’

and e.부서코드 = ‘z123’

and c.최종주문금액 >=20000

 

인덱스 구성: 사원pk:사원번호,  사원x1:입사일자, 고객pk: 고객번호, 고객x1: 관리사원번호, 고객_x2: 최종주문금액

 

1. 각 테이블의 조건을 넣었을 때 outer 결과건수가 낮게 나오는 테이블을 앞에 둬야함

즉 조인 순서를 변경해서 랜덤 엑세스 발생량을 줄일수 있는지 확인해봐야함

2. e 조건 즉 outer 조건이 먼저 읽혀짐.그래서 outer 조건을 상단으로 올려주는 습관을 가져야

3. 입사일자가 단일 인덱스 비효율 발생.so 부서코드가 많을시 인덱스 사용 고려 해야함

( 입사일자가 부등호라 부서코드와 인덱스 순서를 바꾸는것도 방법)

 

NL 조인의 특징 요약

 

1. 랜덤 엑세스 위주의 조인 방식(대량 데이터 처리시 매우 치명적인 한계)

2. 조인을 한 레코드씩 순차적으로 진행(but 큰 테이블을 조인하더라도 매우 빠른 응답 속도를 낼수 있음)

3. 마지막으로 다른 조인방식과 비교할 때 인덱스 구성 전략이 특히 중요함

 

NL 조인은 소량 데이터를 주로 처리, 부분범위 처리가 가능한 온라인 트랜잭션 처리시스템에 적합한 조인 방식

Comments