Skip to content

5조 SQL JOIN

kariskan edited this page Jul 15, 2024 · 1 revision
  • 둘 이상의 테이블을 연결해서 데이터를 조회하는 방법이다.

image

  • INNER JOIN
    • 내부 조인으로 교집합과 같이 데이터가 겹치는 부분만 조회된다.
  • LEFT/RIGHT JOIN
    • 왼쪽 혹은 오른쪽에 있는 데이터가 모두 조회된다.
  • OUTER JOIN
    • join돼 있는 모든 테이블이 가지고 있는 데이터를 조회한다.
  • cross join
    • 한 테이블의 모든 행과 다른 테이블의 모든 행을 조인한다.
    • cartesian 곱을 진행함

DB Join 최적화 방식

nested loops join

  • 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 ROW를 결합하여 원하는 결과를 조합하는 방식으로, 조인해야 할 데이터가 많지 않은 경우 사용된다.

  • driving table, driven 테이블로 2중 for문을 돌린다고 생각하면 됨

  • 순서

    1. 선행 테이블 → 조건 만족 행 찾기
    2. 선행 테이블의 조인 키 값을 가지고 후행 테이블에 조인 키 존재 확인 후 조인 시도
    3. 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는 지 확인한다
    • 만약, 존재하지 않으면 선행 테이블 데이터는 필터링 된다
    1. 인덱스에서 추출된 레코드 식별자 → 후행 테이블 액세스
    • 후행 테이블에 주어진 조건 만족 → 해당 행 추출버퍼에 넣기
    1. 앞의 방법을 반복 수행
  • 특징

    • 랜덤 액세스 방식으로 데이터 읽음 → 많은 IO 발생 가능성 O
    • 조인 성공 시 바로 조인 결과를 보여줌
    • 후행 테이블에 인덱스가 존재해야 사용 가능
    • 선행 테이블이 작고 처리 범위가 좁은 경우 효과적

구동 테이블(driving table) 과 내부 테이블 (Inner table)

  • 구동 테이블은 조인이 진행될 때 주도적으로 다른 테이블의 결합키에 다가가서 매칭을 시도하는 테이블 입니다.

image

  • 인덱스에 의한 랜덤 엑세스에 기반하고 있기 때문에 대용량 데이터엔 적합하지 못함
    • 그래서 driving table에 조인을 위한 인덱스가 생성돼 있어야 함
    • driving table을 통해 driven table을 접근할 때 랜덤 엑세스가 발생
  • driving table로 데이터가 적거나 필터링 많이 돼 있는 테이블이면 좋다.

Sort Merge Join

  • 조인 대상 범위가 넓을 경우 랜덤 엑세스를 줄이기 위하거나, 인덱스가 존재하지 않을 경우 해결하기 위한 조인 방식이다.

  • 양쪽 테이블의 처리 범위를 각자 access하여 정렬한 결과를 차례로 scan하면서 연결 고리의 조건으로 머지하는 방식이다.

  • 순서

    1. 선행 테이블에서 주어진 조건 만족 행 찾음
    2. 선행 테이블의 조인 키 기준 → 정렬작업 [이를 조건 만족하는 선행 테이블 모든 행에 반복 수행]
    3. 후행 테이블에서 주어진 조건을 만족 행 찾음
    4. 후행 테이블의 조인 키 기준 → 정렬작업 [이를 조건 만족하는 후행 테이블 모든 행에 반복 수행]
    5. 정렬된 결과를 이용하여 조인을 수행한다.
    6. 조인에 성공 → 추출버퍼에 넣기
  • 특징

    • 인덱스가 없어도 사용 가능
    • 앞 단계에 정렬작업이 미리 수행되어 있으면 최적화
    • 정렬 데이터가 많아 메모리에서 불가능할 때 → 디스크 사용 → 성능 떨어짐
    • 동등 조인과 비동등 조인에 대한 작업도 가능

image

  • join의 on절에 =이 아닌 비교 연산자가 사용된 경우 많이 사용한다.
  • 위 그림에서는 color은 인덱스가 걸려있고, size는 안 걸려 있는데, 왼쪽과 오른쪽에 인덱스를 통한 스캔, 풀 테이블 스캔을 각각 한 다음에 별도 공간에서 joinKey를 기준으로 정렬하고 병합정렬처럼 scan하면서 a.joinkey_a=b.joinkey_b로 머지한다.

hash join

  • 조인될 두 테이블 중 하나를 해시 테이블로 선정해서 조인될 테이블의 조인 키 값을 해시 알고리즘으로 비교하여 매치되는 결과값을 얻는 방식이다.
  • 그래서 =연산을 통한 조인에서만 사용될 수 있고, 많은 데이터를 조인해야 하는 경우에 사용된다.

image

  • 둘 중 작은 집합(build input)을 읽어 해시 공간에 해시 테이블을 생성한다.
  • 반대쪽 큰 집합(probe input)을 읽어 읽은 데이터를 해시 함수에 넣고, 결과 버킷 주소로 찾아가 해시 체인을 스캔하면서 데이터를 찾는다.

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally