Post List

2015년 1월 9일 금요일

대용량 데이터베이스 솔루션 2권 #07 JOIN

JOIN을 활용한 Data 연결



우리는 JOIN 이라고 하면 위와 같은 모양만을 생각해왔다.
1 : M 이나 M : 1로 EQUAL JOIN 만 주로 활용했었다.
하지만 JOIN에는 EQ JOIN만 있는게 아니다.


JOIN을 집합간의 곱(*)으로 생각해야 한다.
EQ 연산뿐 아니라 모든 연산자가 연결조건이 될 수 있다.
1 : M , M: 1 로 연결한다고 생각하지 말고,
1 X M = M 만큼 나열된다고 생각을 하자. (1 X 1 = 1 만큼 나열, M X N = MN 만큼 나열)

효율적인 JOIN 방법

1. 추출하고자 하는 집합(치역)의 Record 단위를 결정
2. 추출 결과의 Record 단위와 가장 유사한 기준Table을 선정하였을 때
    치역의 모든 값들이 그 Table안에 다 있으면 JOIN 할 필요없이 그냥 부분범위 처리를  검토
3. 결과로 추철할 SELECT LIST 확정
4. SELECT LIST 가공에 필요한 다른 Table 선택
   만약 그중에 가공후 처리 가능한 집합이 있으면 '일단 보류 분'으로 따로 분리 (잴 나중에 JOIN)
5. 기준 Table과의 관계를 확인(1:1, 1:M)하여 ER-Diagram 작성
   (개발자 책상위엔 ER-D가 무조건 있어야 한다.)
6. JOIN Column(연결고리) 및 INDEX 구조 확인
7. Driving Table 결정 (처리범위, 부분범위 처리 여부 등등...)
8. 나머지 Table JOIN 순서 결정 (먼저 연산해서 결과를 줄일수 있는것 위주로)
9. 가공 완료된 집합을 Inline-View로 묶고 '일단 보류 분' JOIN

JOIN 순서 결정


위와 같은 ER-D가 있다고 하자.
- TAB1이 기준 Table이 되겠으며
- TAB1 과 TAB2은 1 : M 관계이고, (M의 크기가 어느 정도인지 확인. 1:10인지, 1:10000 인지..)
- TAB4는 아빠 Table인데 뭐 아빠는 없을수도 있고,
- TAB3는 엄마 Table, TAB5는 알머니 Table이다.
라고 미리 생각을 한번 해보고 이제 JOIN 순서를 결정하자.

1. DRIVING Table 결정

1.1 자격 요건 심사
- 상수값 보유 ? (해당 상수값으로 범위를 많이 줄일수 있는지, INDEX는 있는지)
- Subquery에서 ? (공급하면 받아 먹을수 있는지)
- Outer JOIN 아닌것

1.2 최소처리범위 선정
- 확보한 상수값(Subquery 포함)에 의해 처리되는 범위 대비
- 처리범위를 가장 효과적으로 줄여주는 INDEX 감안
- 부분범위처리 가능하면 나중 JOIN 되는 집합의 성공확률 감안 (내가 공급해주는건 많은데 다 버리는 것인지)
- 하위집합과의 비교는 관계정도(Degree)감안하여 대비 (1:10인지, 1:10000인지)

2. 예하 Table 우선순위 결정

1.1 자격 요건 심사
- 연결가능여부 및 연결고리 상태 확인(기존 상수값 + 받은 상수값 => 최적 INDEX)

1.2 우선 순위 결정
- 연결가능 Table중 연결후 성공한 결과가 최사가 되는 것부터
- Outer JOIN이나 하위레벨 Table은 가능한 나중에 JOIN
- Group by한 집합과 JOIN가능시 이전 JOIN을 INLINE VIEW로 묶고 JOIN (먼저 Group by로 줄여서 JOIN)

<<< EQ JOIN은 생략하자. 이건 뭐 사실 다 아니깐... >>>

작가
이화식
출판
엔코아컨설팅
발매
1999.11.20
평점
블로거의 오늘의 책에 참여한 포스트 입니다

댓글 없음:

댓글 쓰기