Join의 종류 / 원리

임준성·2023년 5월 4일
0

CS

목록 보기
8/9

JOIN

Join이란 ??

  • 두 개 이상의 테이블을 하나의 집합으로 만드는 연산

  • 테이블로서 저장되거나, 그 자체로 이용할 수 있는 결과 Set이 만들어짐

  • 의미 있는 데이터의 집합을 만들기 위해서 테이블 간의 관계를 갖게 해줌

  • 저장 공간의 효율성과 확장성이 향상됨

  • 서로 관계있는 데이터가 여러 테이블로 나뉘어 저장되므로 각 테이블에 저장된 데이터를 효과적으로 검색하기 위해 조인이 필요함


내부 조인 (Inner Join)

  • 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만 표기
  • 가장 흔한 결합 방식이며 기본적인 조인 형식임

왼쪽 조인 (Left Outer Join)

  • 왼쪽 테이블의 모든 행이 결과 테이블에 표기
  • 우측 테이블에 조인할 컬럼의 값이 없는 경우 사용

오른쪽 조인(Right Outer Join

  • 오른쪽 테이블의 모든 행이 결과 테이블에 표기
  • 좌측 테이블에 조인할 컬럼의 값이 없는 경우 사용

합집합 조인(Full Outer Join)

  • 두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기
  • 양쪽 테이블 모두 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으로 일일이 비교해야 하기 때문)

  • 처리 방식

    • Driving Table의 처리 범위를 하나 씩 엑세스 하면서 추출된 값으로 Driven Table을 조인하는 방식으로 동작 ( 바깥 테이블의 처리 범위를 하나 씩 접근하며 추출된 값으로 테이블을 조인하는 방식 )
  • 동작 순서

    1) 선행 테이블의 조건을 만족하는 행을 Search
    2) 선행 테이블의 Join Key값을 가지고 후행 테이블에서 Join 수행
    3) 선행 테이블의 조건을 만족하는 모든 행에 대해 작업 반복 수행

정렬 병합 조인

  • 정의
    양 테이블을 각각 접근하여 결과를 정렬하고, 정렬한 결과를 Scan해가면서 연결 조건으로 Merge하는 방식

  • 특징

    • 동시처리 ( 양 테이블을 동시에 읽고 양 테이블이 join 준비가 되었을 때 join 수행 )
    • 독립적임 ( 처리 범위를 줄일 수 있는 수단은 각 테이블의 while 조건 )
    • 정렬할 데이터가 많은 경우 임시 영역(Disk)을 사용하기 때문에 성능이 떨어질 수 있음
    • 정렬된 양쪽 결과를 스캔하는 방식이므로 인덱스 유무는 중요하지 않음
    • 대량의 조인 작업은 CPU 작업 위주로 처리하는 Hash Join이 성능상 유리
  • 동작 순서

    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 동작 순서

    • Parser : SQL문장을 분석하여 문법 검사와 구성요소를 파악하고 이를 파싱 해서 파싱 트리를 만듦
    • Query Transformer : 파싱된 SQL을 보고 같은 결과를 도출하되, 좀 더 나은 실행 계획을 갖는 SQL로 변환이 가능한지를 판단하여 변환 작업을 수행
    • Estimator : 시스템 통계정보를 딕셔너리로부터 수집하여 SQL을 실행할 때 소요되는 총비용을 계산
    • Plan Generator : Estimator를 통해 계산된 값들을 토대로 후보군이 되는 실행계획을 도출
    • Row-Source Generator : 옵티마이저가 생성한 실행계획을 SQL 엔진이 실제 실행할 수 있는 코드나 프로시저 형태로 포맷팅
    • SQL Engine : SQL을 실행







출처
면접을 위한 CS 전공 지식 노트
정보통신 기술본 책자
https://hoon93.tistory.com/46
https://land-turtler.tistory.com/121
https://coding-factory.tistory.com/743
https://coding-factory.tistory.com/756

profile
아무띵크 있이

0개의 댓글