ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Join 방식
    STUDY/DB 2023. 4. 13. 00:58

    Join

    두 개 이상의 테이블에서 조인 컬럼에 일치하는 행을 찾아서 연결하는 것으로, 대부분 SQL 쿼리에서 사용되며, 데이터베이스의 논리적 연산 중 하나이다.

     

    Driving Table

    조인을 할 때 기준이 되는 테이블로, 조인 컬럼에 대해 인덱스를 가지고 있는 경우에 선택된다. 인덱스를 가진 테이블을 기준으로 조인을 수행하면, 조인 컬럼을 이용해 빠르게 해당 행을 찾을 수 있다.

     

    Driven Table

    드라이빙 테이블에서 조인 컬럼과 일치하는 모든 행을 찾아서 조인하는 테이블

     

    Join 종류

    1. Nested Loop Join(순차적 루프에 의한 접근 방식) 

    - 가장 기본적인 Join 방식으로, 두 개의 테이블 중 하나를 기준으로 하나씩 순차적으로 읽어들이면서 다른 테이블과 조인하는 방식

    • 순차적으로 처리된다.
    • 선행 테이블과 일치하는 값을 후행 테이블에서 찾아야 하므로 후행 테이블의 해당 열에 인덱스가 필요하다.
    • 메모리 사용량은 가장 적다.
    • 랜덤 엑세스 방식으로 데이터를 읽음
    • 두 테이블의 크기는 성능과 관련이 없다.

    - 작동 방식

    1. 조인할 두 개의 테이블 중 하나를 기준으로 선택(보통은 인덱스를 가진 테이블을 기준으로 선택)
    2. 기준 테이블을 스캔하면서 조인 컬럼의 값을 가져옴
    3. 가져온 조인 컬럼 값을 이용하여 다른 테이블을 스캔하여 일치하는 값을 찾음
    4. 일치하는 값이 존재하면, 두 테이블의 행을 조인하여 결과를 반환
    5. 2-4 단계를 반복하여 모든 조인 결과를 반환

    - 작은 테이블에 대해서는 높은 성능을 보이지만, 대용량 테이블에 대해서는 처리 속도가 느리다.

    - 조인 컬럼이 인덱스로 지정된 경우 효율적

    - 조인 컬럼의 카디널리티가 높은 경우에는 비효율적

     

    [예시]

    처리 순서

    1. 고객 테이블에서 이름이 '홍길동'인 고객을 구한다(선행 테이블 결정).
    2. '홍길동' 고객의 수만큼 순차적으로 주문 테이블 고객번호 컬럼으로 접근한다(순차적 접근).
    3. 주문 테이블에서 주문일자가 '20220101'인 정보만 필터한다.

     

    2. Sort Merge Join(정렬을 통한 접근 방식)

    - 두 개의 테이블을 정렬한 후, 정렬된 결과를 조인하는 방식

    - 조인 컬럼에 대한 인덱스가 없어도 처리가 가능

    - 대용량 테이블이나, 조인 컬럼의 카디널리티가 높은 경우에도 높은 성능을 보임

    - 두 테이블을 정렬해야 하기 때문에, 높은 자원 사용량을 가짐

    - 정렬이 필요하므로 처리 속도가 느릴 수 있음

    - 작동 방식

    1. 조인할 두 개의 테이블을 각각 조인 컬럼을 기준으로 정렬
    2. 정렬된 두 테이블을 순차적으로 비교하면서 일치하는 행을 찾아 조인
    3. 2단계를 반복하여 모든 조인 결과를 반환

    [예시]

    처리 순서

    1. 고객 테이블에서 이름이 '홍길동'인 고개글 구한 후 고객번호 순으로 정렬한다(SORT).
    2. 주문 테이블에서 주문일자가 '20220101'인 주문을 구한 후 고객번호 순으로 정렬한다(SORT).
    3. 정렬된 고객정보와 정렬된 주문정보를 고객번호로 조인한다(MERGE).

     

    3. Hash Join(해시 함수를 이용한 접근 방식)

    - 두 개의 테이블 중 하나를 기준으로 해시 함수를 사용하여 해시 테이블을 만들고, 다른 테이블에서는 같은 해시 함수를 사용하여 조인 컬럼의 값을 해싱한 후, 해시 테이블에서 일치하는 값을 찾아서 조인하는 방식

    - 해시 함수를 이용하여 조인을 수행하기 때문에 "="로 수행하는 조인에서만 사용 가능하다.

    - 해시 함수를 이용하여 조인을 수행하기 때문에, 인덱스를 생성할 필요가 없다.

    - 해시 함수를 사용하여 메모리를 효율적으로 사용하기 때문에, 대용량의 테이블에서 빠른 처리 속도를 보임

    - 해시 테이블 구성 작업에 부하가 많이 발생하기 때문에, 작은 테이블에 먼저 접근하는 것이 성능 면에서 효율적

    - 해시 함수를 계산하는 데 걸리는 시간이 오래 걸리기 때문에 초기 설정 시간이 길어질 수 있고, 해시 충돌이 발생할 경우 성능이 저하될 수 있음

    - 작동 방식

    1. 조인할 두 개의 테이블 중 하나를 선택하여 조인 컬럼을 기준으로 해시 테이블을 생성
    2. 선택된 테이블의 모든 행에 대해 해시 함수를 적용하여 해시 테이블에 저장(조인 컬럼과 SELECT절에서 필요로 하는 컬럼도 함께 저장)
    3. 나머지 테이블의 모든 행에 대해 해시 함수를 적용하여 해시 테이블에서 일치하는 값이 있는지 검색
    4. 해시 테이블에서 검색한 결과와 일치하는 행을 찾아서 조인
    5. 3-4 단계를 반복하여 모든 조인 결과를 반환

    [예시]

    처리 순서

    1. 조직 테이블에서 사업부가 '강원사업부'인 조직들을 구한 후, 조인절 컬럼인 조직코드를 해시 함수로 분류한 다음, 해시 테이블을 생성한다(해시 함수를 이용해 해시 테이블 생성).
    2. 집계 테이블에서 처리년월이 '202201'인 자료를 구한 후, 조인절 컬럼인 조직코드를 해시 함수로 변환 후 해시 테이블로 순차적으로 접근한다(해시 함수를 통해 해시 테이블 탐색).

     

     

     

    참고

    https://velog.io/@eunhye_/SQL-%EC%A1%B0%EC%9D%B8Join-%EC%88%98%ED%96%89-%EC%9B%90%EB%A6%AC

    'STUDY > DB' 카테고리의 다른 글

    Isolation Level  (0) 2023.04.25
    실행계획  (0) 2023.04.19
    Index Scan  (0) 2023.04.12
    개발자를 위한 인덱스 생성과 SQL 작성 노하우 : 22-24  (0) 2022.08.30
    개발자를 위한 인덱스 생성과 SQL작성 노하우 : 18-20  (0) 2022.08.15
Designed by Tistory.