상세 컨텐츠

본문 제목

[SQLD] 조인 종류와 수행 원리

IT/SQLD(SQL개발자)

by pandada 2019. 7. 5. 17:53

본문

반응형

 

조인 종류와 수행 원리

 

Join 

  - 두 개 이상의 테이블을 하나의 집합으로 만드는 연산(두 테이블 사이에서 수행)

  - 자주 사용하는 Join으는 NL Join, Sort Merge Join, Hash Join이 있다.

 

NL Join( Nested Loop Join )

  - 중첩된 반복문과 유사한 방식으로 사용.

  - 랜덤 액세스 방식으로 데이터를 읽는다.

  - 외부 테이블의 각 행에 대해 내부 테이블을 한 번만 스캔한다.

 

작업 방식

  1. 선행 테이블에서 주어진 조건을 만족하는 행을 찾는다.

    -> 이때 선행 테이블에 주어진 조건을 만족하는 첫 번째 행을 찾는다.

  2. 선행 테이블의 조인 키 값을 가지고 후행 테이블에 조인 키가 존재하는지 확인.

    -> 조인 시도

  3. 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는지 확인

    -> 선행 테이블의 조인 값이 후행 테이블에 존재하지 않으면 선행 테이블 데이터는 필터링 됨. (더 이상 조인 작업을 진행할 필요 없음.)

  4. 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블을 액세스

    -> 인덱스 스캔을 통한 테이블 액세스

 

장점

- 처리량이 많을 때 성능상 이점이 있다.

 

단점

- 정렬에 따른 부담( 메모리 사용 증가 )

 

 

 Sort Merge Join

  - 칼럼을 기준으로 데이터를 정렬하여 조인을 수행

  - 스캔 방식으로 데이터를 읽는다.

  - 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 경우데도 사용할 수 있는 기법이다.

  - 조인 작업을 위해 항상 정렬 작업이 발생하는 것은 아님.

 

작업 방식

  1. 선행 테이블에서 주어진 조건을 만족하는 행을 찾는다.

  2. 선행 테이블의 조인 키를 기준으로 정렬 작업을 수행.

  3. 1~2번 작업을 선행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행

  4. 후행 테이블에서 주어진 조건을 만족하는 행을 찾는다.

  5. 후행 테이블의 조인 키를 기준으로 정렬 작업을 수행.

  6. 4~5번 작업을 후행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행

  7. 정렬된 결과를 이용하여 조인을 수행하며 조인에 성공하면 추출 버퍼에 넣는다.

 

 

Hash Join

  - 해싱 기법을 이용하여 조인을 수행.

  - 조인을 수행할 테이블의 조인 칼럼을 기준으로 해쉬 함수를 수행하여 서로 동일한 해쉬 값을 갖는 것들 사이에서 실제 값이 같은지를 비교하면서 조인을 수행한다.

  - 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 경우데도 사용할 수 있는 기법이다.

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

  - 해쉬함수를 적용한 값은 어떤 값으로 해슁될 지 알 수 없다.

  - 해쉬 함수가 적용될 때 동일한 값은 항상 같은 값으로 보장된다.

  - But. 큰값이 항상 큰값으로 해슁되고 작은 값이 항상 작은 값으로 해슁된다는 보장은 없다.

 

작업 방식

  1. 선행 테이블에서 주어진 조건을 만족하는 행을 찾는다.

  2. 선행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해쉬 테이블을 생성

     -> 조인 칼럼과 SELECT 절에서 필요로 하는 칼럼도 함께 저장된다.

  3. 1~2번 작업을 선행테이블의 조건을 만족하는 모든 행에 대해 반복 수행

  4. 후행 테이블에서 주어진 조건을 만족하는 행을 찾는다.

  5. 후행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해당 버킷을 찾는다.

    ->조인 키를 이용해서 실제 조인될 데이터를 찾는다.

  6. 조인에 성공하면 추출버퍼에 넣음

  7. 4~6번 작업을 후행 테이블의 조건을 만족하는 모든 행에 대해서 반복 수행

 

 

Reference.(Hashing join)

  - 조인 작업을 수행하기 위해 해쉬 테이블을 메모리에 생성해야 한다.

  - 생성된 해쉬 테이블의 크기가 메모리에 적재할 수 잇는 크기보다 더 커지면 임시 영역(디스크)에 해쉬 테이블을 저장된다. Then. 추가적인 작업이 필요함.

  - 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다. 선행테이블의 결과를 완전히 메모리에 저장할 수 있다면 임시 영역에 저장하는 작업이 발생하지 않기 때문이다.

 

 

 

 

 

반응형

관련글 더보기

댓글 영역