Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

dongdorodongdong

JOIN 본문

SQLD

JOIN

d5ngs 2019. 11. 28. 14:38

JOIN

  • 정의
    - 두 개 이상의 테이블을 하나의 집합으로 만드는 연산
    - FROM 절에 나열된 모든 테이블이 join 될 때 까지 반복 수행

  • 종류
    - NL JOIN
    - Sort Merge JOIN
    - Hash JOIN

NL JOIN (Nested Loop Join)
  • 특징
    - 랜덤 방식으로 데이터를 엑세스 하기 때문에 처리 범위가 좁은 것이 유리
    - 선행 테이블의 조건을 만족하는 모든 행의 수 만큼 반복작업을 실시 (결과 수가 적은 테이블을 선행테이블로 선정하는 것이 좋음)
    - Sort-Merge, Hash Join과는 다르게 OLTP 목록 처리 업무에 많이 사용
    - Join 컬럼에 적당한 인덱스가 있어서 Natural Join이 효율적일 때 유용
    - Unique Index를 활용하여 수행시간이 적게 걸리는 소량 테이블을 온라인 조회하는 경우에 유용

    * 선행/외부 테이블
    > 반복문의 외부에 있는 테이블
    * 후행/내부 테이블
    > 반복문의 내부에 있는 테이블
    * 추출버퍼
    > SQL문 실행결과를 보관하는 버퍼
    > 일정 크기를 설정하여 버퍼에 결과가 모두 차거나, 더 이상 채워질 결과가 없으면 반환

  • 동작 과정

    1. 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음
    > 주어진 조건을 만족하지 않는 경우 해당 데이터는 필터링
    2. 선행 테이블의 join key를 가지고 후행 테이블에 join key가 존재하는지 찾음
    > join 시도
    3. 후행 테이블의 인덱스에 선행 테이블의 join key가 존재하는지 확인
    > 선행 테이블의 join 값이 후행 테이블에 존재 하지 않으면 필터링
    4. 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블을 엑세스
    > 인덱스 스캔을 통한 테이블 엑세스
    5. 후행 테이블에 주어진 조건까지 모두 만족하면 해당 행을 추출 버퍼에 넣음
    6. 반복

    * 즉, 선행 테이블을 Full Scan / 선행 테이블의 join key를 갖고 후행 테이블의 인덱스를 Unique Scan
    / 인덱스 스캔 결과를 이용해 후행 테이블 읽음 / JOIN
    * join 조건 컬럼에 인덱스가 없다면 후행 테이블 마저 Full Scan 해야 하므로 실행계획이 Sort-Merge나 Hash 조인으로 수립될 것임


Sort-Merge JOIN

  • 특징
    - join 컬럼을 기준으로 데이터를 정렬하여 join
    - 스캔 방식으로 데이터를 읽음
    - 정렬할 데이터가 많아 메모리에서 작업 수행이 어려우면, 임시영역(디스크)를 사용하기 때문에 성능이 떨어질 수 있음
    - join 컬럼에 적당한 인덱스가 없어서 NL Join이 비효율적일 때 사용할 수 있음
    - 선행 테이블의 개념이 중요하지 않은 조인 방식
    - join 컬럼의 인덱스가 없어도 사용 가능 (인덱스의 유무에 영향을 받지 않음)
    - Hash join과는 달리 동등조인, 비동등 조인에 대해 join 가능
    - join이 되는 두 테이블의 크기가 다르다면 정렬되는 시간이 동일하지 않아 시간에 대한 손실이 발생
    - NL Join과는 다르게 DW 등의 집계 업무에 많이 사용

  • 동작 과정

    1. 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음
    2. 선행 테이블의 join key를 가지고 정렬 수행
    3. 선행 테이블에서 조건을 만족하는 모든 행에 대해서 1~2 작업을 반복 수행
    4. 후행 테이블에서 주어진 조건을 만족하는 행을 찾음
    5. 후행 테이블의 join key를 기준으로 정렬 수행
    6. 후행 테이블의 조건을 만족하는 모든 행에 대해서 4~5 작업을 반복 수행
    7. 정렬된 결과를 이용하여 join 수행
    8. join에 성공하면 버퍼에 넣음



Hash JOIN

  • 특징
    - 해싱 기법을 이용하여 join
    - 각 테이블의 join 컬럼을 기준으로 해시 함수를 수행하고 서로 동일한 해시 값을 갖는 것들 사이에서
    실제 값이 같은지를 비교하며 join 수행
    - join 컬럼에 적당한 인덱스가 없어서 NL Join이 비효율적일 때 사용할 수 있음
    - NL Join의 랜덤 엑세스 문제, Sort-Merge Join의 정렬 부담의 대안으로 등장
    - join 컬럼의 인덱스가 없는 경우에도 사용 가능 (인덱스의 유무에 영향을 받지 않음)
    - 동등조인 에서만 사용 가능
    - 메모리에 Hash Table을 생성 해야 함 (메모리의 크기가 작다면 임시 영역(디스크)에 저장)
    - 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋음
    - 선행 테이블을 Build Input이라고도 하며, 후행 테이블은 Prove Input 이라고 함
    - NL Join과는 다르게 DW 등의 집계 업무에 많이 사용

  • 동작 과정


1. 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음
2. 선행 테이블의 join key를 기준으로 해시 함수를 적용하고, Hash Table을 생성
(join 컬럼과, SELECT 절에서 필요한 컬럼도 함께 지정)
3. 선행 테이블 조건을 만족하는 모든 행에 대해서 1~2을 반복 수행
4. 후행 테이블에서 주어진 조건을 만족하는 행을 찾음
5. 후행 테이블의 join key를 기준으로 해시 함수를 적용하고, 해당 버킷을 찾음
6. join에 성공하면 추출 버퍼에 넣음
7. 후행 테이블의 조건을 만족하는 모든 행에 대해서 4~6을 반복 수행



* 일반적으로 Hash Join이 Sort-Merge보다 더 우수한 성능을 보이지만, Join 대상 테이블이 join key 컬럼으로 정렬 되어 있을 때는 Sort-Merge가 더 우수한 성능을 낼 수도 있다.

'SQLD' 카테고리의 다른 글

인덱스  (0) 2019.11.28
옵티마이저  (0) 2019.10.28
절차형 SQL  (0) 2019.10.25
DCL  (0) 2019.10.25
윈도우 함수  (0) 2019.10.25