-
Notifications
You must be signed in to change notification settings - Fork 0
5조 SQL JOIN
kariskan edited this page Jul 15, 2024
·
1 revision
- 둘 이상의 테이블을 연결해서 데이터를 조회하는 방법이다.
- INNER JOIN
- 내부 조인으로 교집합과 같이 데이터가 겹치는 부분만 조회된다.
- LEFT/RIGHT JOIN
- 왼쪽 혹은 오른쪽에 있는 데이터가 모두 조회된다.
- OUTER JOIN
- join돼 있는 모든 테이블이 가지고 있는 데이터를 조회한다.
- cross join
- 한 테이블의 모든 행과 다른 테이블의 모든 행을 조인한다.
- cartesian 곱을 진행함
-
2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 ROW를 결합하여 원하는 결과를 조합하는 방식으로, 조인해야 할 데이터가 많지 않은 경우 사용된다.
-
driving table, driven 테이블로 2중 for문을 돌린다고 생각하면 됨
-
순서
- 선행 테이블 → 조건 만족 행 찾기
- 선행 테이블의 조인 키 값을 가지고 후행 테이블에
조인 키 존재 확인
후 조인 시도 - 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는 지 확인한다
- 만약, 존재하지 않으면 선행 테이블 데이터는 필터링 된다
- 인덱스에서 추출된 레코드 식별자 → 후행 테이블 액세스
- 후행 테이블에 주어진 조건 만족 → 해당 행 추출버퍼에 넣기
- 앞의 방법을 반복 수행
-
특징
- 랜덤 액세스 방식으로 데이터 읽음 → 많은 IO 발생 가능성 O
- 조인 성공 시 바로 조인 결과를 보여줌
- 후행 테이블에 인덱스가 존재해야 사용 가능
- 선행 테이블이 작고 처리 범위가 좁은 경우 효과적
구동 테이블(driving table) 과 내부 테이블 (Inner table)
- 구동 테이블은 조인이 진행될 때 주도적으로 다른 테이블의 결합키에 다가가서 매칭을 시도하는 테이블 입니다.
- 인덱스에 의한 랜덤 엑세스에 기반하고 있기 때문에 대용량 데이터엔 적합하지 못함
- 그래서 driving table에 조인을 위한 인덱스가 생성돼 있어야 함
- driving table을 통해 driven table을 접근할 때 랜덤 엑세스가 발생
- driving table로 데이터가 적거나 필터링 많이 돼 있는 테이블이면 좋다.
-
조인 대상 범위가 넓을 경우 랜덤 엑세스를 줄이기 위하거나, 인덱스가 존재하지 않을 경우 해결하기 위한 조인 방식이다.
-
양쪽 테이블의 처리 범위를 각자 access하여 정렬한 결과를 차례로 scan하면서 연결 고리의 조건으로 머지하는 방식이다.
-
순서
- 선행 테이블에서 주어진 조건 만족 행 찾음
- 선행 테이블의 조인 키 기준 → 정렬작업 [이를 조건 만족하는 선행 테이블 모든 행에 반복 수행]
- 후행 테이블에서 주어진 조건을 만족 행 찾음
- 후행 테이블의 조인 키 기준 → 정렬작업 [이를 조건 만족하는 후행 테이블 모든 행에 반복 수행]
- 정렬된 결과를 이용하여 조인을 수행한다.
- 조인에 성공 → 추출버퍼에 넣기
-
특징
- 인덱스가 없어도 사용 가능
- 앞 단계에 정렬작업이 미리 수행되어 있으면 최적화
- 정렬 데이터가 많아 메모리에서 불가능할 때 → 디스크 사용 → 성능 떨어짐
- 동등 조인과 비동등 조인에 대한 작업도 가능
- join의 on절에 =이 아닌 비교 연산자가 사용된 경우 많이 사용한다.
- 위 그림에서는 color은 인덱스가 걸려있고, size는 안 걸려 있는데, 왼쪽과 오른쪽에 인덱스를 통한 스캔, 풀 테이블 스캔을 각각 한 다음에 별도 공간에서 joinKey를 기준으로 정렬하고 병합정렬처럼 scan하면서 a.joinkey_a=b.joinkey_b로 머지한다.
- 조인될 두 테이블 중 하나를 해시 테이블로 선정해서 조인될 테이블의 조인 키 값을 해시 알고리즘으로 비교하여 매치되는 결과값을 얻는 방식이다.
- 그래서 =연산을 통한 조인에서만 사용될 수 있고, 많은 데이터를 조인해야 하는 경우에 사용된다.
- 둘 중 작은 집합(build input)을 읽어 해시 공간에 해시 테이블을 생성한다.
- 반대쪽 큰 집합(probe input)을 읽어 읽은 데이터를 해시 함수에 넣고, 결과 버킷 주소로 찾아가 해시 체인을 스캔하면서 데이터를 찾는다.