제3절_조인_수행_원리
2012.04.12 00:51
(출처 : 2011 SQLD 스터디 이황배 회원님 자료)
- 조인이란?
- 두 개 이상의 테이블을 하나의 집합으로 만드는 연산.
- SQL문에서 FROM 절에 두 개 이상의 테이블이 나열 될 경우 조인 수행.
- 조인 연산은 두 테이블 사이에서 수행.
- 조인의 종류
- NL Join, Sort Merge Join, Hash Join
1. NL Join
- NL Join 정의
- 두개의 테이블을 중첩된 반복문처럼 조인을 수행한다.
- 반복문 외부(처음 테이블)에 있는 테이블을 선행테이블 또는 외부 테이블
- 반복문 내부(두번째 테이블)에 있는 테이블을 후행테이블 또는 내부 테이블 이라고 부른다.
# 조인을 반복문으로 표현하면 아래와 같다.
for 선행 테이블 읽음 ---다른말로---> 외부 테이블(Outer Table)
for 후행 테이블 읽음 ---다른말로---> 내부 테이블(Inner Table)
(선행 테이블과 후행 테이블 조인)
- NL Join 중요사항
- 결과 행의 수가 적은 테이블을 선행 테이블로 선택한다.
(왜냐하면 선행 결과값이 많을 경우 일량이 늘어날 수 있기 때문)
- NL Join 수행 방식
1. 선행 테이블에서 조건에 맞는 값을 찾음
2. 선행 테이블의 조인 키를 가지고 후행 테이블 조인 키 확인
3. 후행 테이블의 인덱스에 선행 테이블의 조인 키 존재 확인
4. 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블 액세스
5 ~ 11 앞의 작업을 반복 수행함
※ 참고
추출버퍼 : SQL 실행결과 보관 버퍼 (유의어 : 운반단위, Array Size, Prefetch Size)
일정 크기를 설정하여 추출버퍼에 결과가 모두 차거나 채울 것이 더 이상 없을 시 결과 반환.
조인 성공 시, 바로 조인 결과를 사용자에게 보여 줄 수 있어,
결과를 가능한 빨리 뿌려줘야하는 온라인 프로그램에 적당한 조인기법이라 설명됨.
2. Sort Merge Join
- Sort Merge Join 정의
- Sort Merge Join은 조인 칼럼을 기준으로 데이터를 정렬하여 조인한다.
- Sort Merge Join 특징
- 넓은 범위의 데이터를 처리할 때 주로 이용.
- 정렬 데이터가 많을 경우 성능이 떨어질 수 있다.(메모리영역이 부족할 시 디스크 I/O로 인한 성능저하 발생)
- 비동등 조인에 대해서도 조인이 가능
- 인덱스를 사용하지 않아 인덱스가 존재하지 않을 경우에 사용 가능.
- Sort Merge Join 수행 방식
1. 선행 테이블에서 조건에 맞는 행을 찾음.2. 선행 테이블의 조인 키를 기준으로 정렬 작업 수행.1 ~ 2번 작업을 반복 수행3. 후행 테이블에서 조건에 맞는 행을 찾음.4. 후행 테이블의 조인 키를 기준으로 정렬 작업 수행.3 ~ 4번 작업을 반복 수행5. 정렬된 결과를 이용하여 조인 수행 -> 결과값은 버퍼에 저장
※ 참고
조인 컬럼의 인덱스를 사용하지 않음
→ 조인 컬럼의 인덱스가 존재하지 않을 경우 사용 가능
조인 작업을 위해 항상 정렬 작업이 발생 하는 것은 아님
→ 조인 작업 전 미리 정렬 작업 수행 등
3. Hash Join
- Hash Join 정의
- 해싱 기법을 이용하여 조인 수행
- Hash Join 특징
- NL Join의 랜덤 액세스 문제점과 Sort Merge Join의 정렬 작업의 부담을 해결 위한 대안으로 사용
- 조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있다.
- "="로 수행하는 조인 즉, 동등 조인만 가능(해쉬함수 이용으로 해쉬 값과 실제 값의 크고 작음이 항상 일치하지 않음)
- 해쉬 테이블의 크기가 메모리에 적재할 수 있는 크기보다 커지면 디스크 사용(I/O에 따른 부하 가중)
즉, 해쉬 조인을 할때 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 유리.
- Hash Join 수행 방식
1. 선행 테이블에서 조건에 만족하는 행을 찾음.
2. 선행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해쉬 테이블 생성
1 ~ 2번 작업을 선행 테이블의 조건 만큼 반복
3. 후행 테이블에서 조건에 만족하는 행을 찾음
4. 후행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해당 버킷을 찾음
5. 조인에 성공하면 추출버퍼에 저장
3 ~ 5번 작업을 후행 테이블의 조건 만큼 수행
※ 참고
선행테이블 = Build Input (해쉬 테이블 생성)
후행테이블 = Prove Input (해쉬 테이블에 대해 해쉬 값 존재여부 확인)
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
38 | 제1절_Lock | balto | 2012.05.05 | 25262 |
37 | 제2절_트랜잭션 | 보라빛고양이 | 2012.05.04 | 8927 |
36 | 제4절_데이터베이스_IO_원리 | 운영자 | 2012.04.30 | 5968 |
35 | 제3절_데이터베이스_Call과_네트워크_부하 | 오예스 | 2012.04.30 | 5907 |
34 | 제2절_SQL_파싱_부하 | ljw | 2012.04.23 | 6357 |
33 | 제1절_데이터베이스_아키텍처 [2] | ljw | 2012.04.23 | 11523 |
» | 제3절_조인_수행_원리 | 실천하자 | 2012.04.12 | 6969 |
31 | 제2절_인덱스_기본 | 실천하자 | 2012.04.12 | 6501 |
30 |
제1절_옵티마이저와_실행계획
![]() | suspace | 2012.04.10 | 8927 |
29 | 제8절_절차형_SQL | 보라빛고양이 | 2012.04.02 | 6544 |
28 | 제7절_DCL(DATA_CONTROL_LANGUAGE) | 보라빛고양이 | 2012.04.02 | 7768 |
27 |
제6절_윈도우_함수(WINDOW_FUNCTION)
![]() | balto | 2012.03.31 | 7697 |
26 |
제5절_그룹_함수(GROUP_FUNCTION)
![]() | balto | 2012.03.31 | 12458 |
25 | 제4절_서브쿼리 | 오예스 | 2012.03.27 | 11874 |
24 | 제3절_계층형_질의와_셀프_조인 | 오예스 | 2012.03.27 | 8672 |
23 | 제9절_조인(JOIN) | 실천하자 | 2012.03.20 | 8489 |
22 | 제8절_ORDER_BY_절 | 실천하자 | 2012.03.20 | 6751 |
21 |
제2절_집합_연산자(SET_OPERATOR)
![]() | ljw | 2012.03.19 | 5800 |
20 |
제1절_표준_조인(STANDARD_JOIN)
![]() | ljw | 2012.03.19 | 15924 |
19 | 제6절_분산_데이터베이스와_성능 | 오예스 | 2012.03.15 | 6968 |