Join이란 ??
내부 조인 (Inner Join)
왼쪽 조인 (Left Outer Join)
오른쪽 조인(Right Outer Join
합집합 조인(Full Outer Join)
중첩 루프 조인
정의
2개 이상의 테이블에서 하나의 테이블을 기준으로 순차적으로 상대방 ROW를 결합하여 원하는 결과를 추출하는 방식
특징
For문과 유사한 방식으로 Join을 수행
반복문 외부에 있는 테이블을 선행 테이블 or 외부 테이블이라 칭함
반복문 내부에 있는 테이블을 후행 테이블 or 내부 테이블이라 칭함
랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서 사용 X
선행 테이블의 결과를 통해 후행 테이블을 액세스 할 때 랜덤 I/O가 발생한다. (두 테이블의 랜덤 I/O가 높게 나옴)
순차적으로 하여 메모리를 추가적으로 요구하지 않아 메모리 사용량이 가장 적음
Driving Table / Driven Table
선행 테이블(Driving Table) : 조인 시 먼저 액세스 되는 테이블로, WHERE 절로 최대한 데이터를 거를 수 있는 테이블 / 데이터 양이 적은 테이블로 선정
후행 테이블(Driven Table): 조인 시 나중에 액세스 되는 테이블 (Driving이 아닌 나머지 테이블)조인을 위한 인덱스가 생성되어 있는 것이 좋음( 없다면 Driving Table에서 도출된 결과와 맞는지 매번 FULL TABLE SCAN으로 일일이 비교해야 하기 때문)
처리 방식
동작 순서
1) 선행 테이블의 조건을 만족하는 행을 Search
2) 선행 테이블의 Join Key값을 가지고 후행 테이블에서 Join 수행
3) 선행 테이블의 조건을 만족하는 모든 행에 대해 작업 반복 수행
정렬 병합 조인
정의
양 테이블을 각각 접근하여 결과를 정렬하고, 정렬한 결과를 Scan해가면서 연결 조건으로 Merge하는 방식
특징
동작 순서
1) 선행 테이블에서 주어진 조건을 만족하는 행을 Search
2) 해당 행들에 대해서, 선행 테이블의 조인 키(칼럼)를 기준으로 데이터를 정렬
3) 후행 테이블에서 주어진 조건을 만족하는 행을 Search
4) 해당 행들에 대해서, 후행 테이블의 조인 키(칼럼)를 기준으로 데이터를 정렬
5) JOIN을 수행후 성공하면 추출버퍼에 넣음
해시 조인
정의
두 테이블 중 하나를 Hash Table로 선정하여, 테이블의 key 값을 Hash 알고리즘으로 비교하여 Join을 수행하는 방식
특징
Hashing 기법을 이용하여 Join 수행
NL Join의 랜덤 액세스 문제점과 Sort Merge Join의 문제점인 정렬 작업의 부담을 CPU 작업 위주로 데이터를 처리함으로써 해결
해쉬 테이블을 메모리에 생성해야하고, 크기가 클 경우 임시 영역에 저장하기 때문에 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋음
먼저 해쉬 테이블을 생성하는 선행 테이블(Build Input), 해쉬 테이블에 대해 해쉬 값의 존재 여부를 검사하는후행 테이블(Prove Input)로 이루어짐
해쉬 함수를 적용한 실제 값은 어떤 값으로 Hashing 될지 예측 불가능. 그러나 해쉬 함수가 적용될 때 동일한 값은 항상 같은 값으로 Hashing됨이 보장됨.
하지만 해쉬 함수를 적용할 떄 보다 큰 값이 항상 큰 값으로 Hashing되고 작은 값이 항상 작은 값으로 Hashing 된다는 보장이 없음. 그렇기에 Hash Join은 Equi Join에서만 사용할 수 있음
빌드 단계
바이트가 더 작은 필드를 기준으로 Hash Table을 빌드하게 됨
-> join에 사용되는 필드가 해시 테이블의 키로 사용됨
프로브 단계
레코드를 읽기 시작하며, 각 레코드에서 일치하는 레코드를 찾아서 결과값 반환
동작 순서
1) 선행 테이블의 조건을 만족하는 행을 Search
2) 해당 행들에 대해서, 선행 테이블의 조인 키(칼럼)를 기준으로 Hash 함수를 적용하여 해시 테이블을 생성
3) 후행 테이블에서 주어진 조건을 만족하는 행을 Search
4) 해당 행들에 대해서, 후행 테이블에 Hash 함수를 적용하여 선행 테이블의 해시 테이블에서 맞는 버킷을 Search
5) Join 수행후 성공하면 추출버퍼에 넣음
6) 후행 테이블의 조건을 만족하는 모든 행에 대하여 3~5번 과정 반복
그렇다면 SQL은 Join을 수행할 때 어떤 Join을 선택할 지 어떠한 기준으로 선택하게 될까 ??
옵티마이저(Optimizer)를 이용하게 된다.
- 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진
실행 속도가 빠른 순으로 규칙을 먼저 세워두고 우선순위가 앞서는 방법을 채택하는 규칙 기반 옵티마이저
옵티마이저에서 실행 계획을 세운 뒤(최대 2천개까지) 비용이 최소한으로 나온 실행 계획을 수행하는 비용 기반 옵티마이저
Optimizer 동작 순서
출처
면접을 위한 CS 전공 지식 노트
정보통신 기술본 책자
https://hoon93.tistory.com/46
https://land-turtler.tistory.com/121
https://coding-factory.tistory.com/743
https://coding-factory.tistory.com/756