Database ( DB )/Database

DB Join의 방식

노루아부지 2019. 8. 11. 10:04
반응형

Join의 종류와 방식

 

Join의 종류 ( 논리적 Join )

 

- INNER Join

- OUTER Join

- CROSS Join

- FULL OUTER Join

- SELF Join

 

Join의 방식 ( 물리적 Join )

 

- Nested Loop Join - 중첩반복

- Merge Join - 정렬병합

- Hash Join - 해시매치

 

 

Join의 방식 1. 중첩반복(Nested Loops) 조인

 

 

바깥 테이블의 처리 범위를 하나씩 액세스하면서 그 추출된 값으로 안쪽 테이블을 조인하는 방식

 

- 순차적으로 처리된다.

- 바깥 테이블과 일치하는 값을 안쪽 테이블에서 찾아야 하므로 안쪽 테이블의 해당 열에 인덱스가 필요하다.

- 메모리 사용량은 가장 적다.

- 바깥 테이블과 안쪽 테이블의 크기는 성능과 관련이 없다.

 

특징

 

순차적인 진행

첫 테이블 필터링 -> 두 테이블간의 연결 -> 최종 운반 단위 산출까지 반복적, 순차적으로 진행됩니다.

 

선행적

선행 테이블의 처리 범위가 전체 일의 양을 결정합니다.

후행 테이블의 필터링 조건은 선행 테이블에서 나온 결과를 한번 더 걸러주는 체크 조건 역할을 할 뿐 전체 처리량을 좌우하지 않습니다.

 

종속적

후행 테이블은 선행 테이블의 결과값을 받아 처리됩니다.

선행 테이블의 결과에 종속적입니다.

하지만 후행 테이블의 인덱스를 전체 일의 양을 줄여줄 수 있는 필터링 조건으로 사용 못합니다. (체크조건으로만 사용)

 

랜덤 액세스

선행 테이블의 결과를 통해 후행 테이블을 액세스 할대 랜덤 I/O가 발생합니다.

선행 테이블은 최초 ROW만 액세스가 발생하고 이후에는 스캔방식으로 진행합니다.

 

장점

 

- 처리량이 적다

- 부분 범위 처리

 

단점

 

- 두 테이블을 연결할 때의 랜덤 I/O가 가장 큰 부담

 

 

 

 

Join의 방식 2. 정렬병합(Sort Merge) 조인

 

 

- 양쪽 테이블의 처리 범위를 각자 액세스하여 정렬한 결과를 차례로 스캔하며, 연결고리 조건으로 Merge하는 방식을 말합니다.

- 이 방식은 경우에 따라 Loop Join 보다 훨씬 빨라지는 경우도 많이 있으며, 랜덤 액세스가 줄어들어 시스템 부하를 감소 시킵니다.

- 하지만 일반적으로 Loop Join보다는 사용빈도가 적습니다.

 

특징

 

동시적 처리

각 키에 의해 정렬된 양쪽 행들을 순차적으로 병합하여 조인을 수행합니다.

 

인덱스가 필요

양 테이블의 모두 조인키에 의해 정렬되어있어야 합니다.

 

전체 범위 처리

선행 테이블, 후행 테이블 크기는 성능과 관련이 없습니다.

그러나 선행 테이블에 중복행이 존재하지 않을때 메모리 사용량이 적으며 권장하고 있습니다.

부분 범위처리를 할 수가 없으며 항상 전체 범위를 처리합니다.

 

스캔방식

주로 스캔방식으로 처리합니다.

자신의 처리범위를 줄이기 위해 인덱스를 사용하는 경우만 랜덤 액세스이며 나머지작업은 스캔방식입니다.

 

조인의 방향과는 무관

테이블 스캔 수는 한번

 

 

장점

 

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

- 중첩반복(Nested Loops)은 연결고리의 상태가 굉장히 중요하다. 한쪽 연결고리에 이상이 발생하면 중첩반복은 심히 고려해야한다. 이때 연결고리에 영향을 받지않는 Sort Merge를 쓰면 좋다.

 

단점

 

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

- 정렬은 tempdb를 사용한다. 정렬양이 극도로 많아 tempdb의 임계치를 넘었을때 순간 전체 데이터베이스에 페이지잠금이 발생하는등 DB성능에 심각한 영향을 줄 수 있다.

- 물론 가공없이 Clustered Index를 그대로 사용하게 되면 정렬은 안해도 되니 이때만큼은 정렬의 부담에서 해방된다.

 

 

해시매치(Hash Match) 조인, 해시(Hash) 조인

 

 

- 조인할 테이블에 대해서 해시 버킷을 생성하고 (이를 빌드입력이라한다) 해시 버킷의 순서대로 결과가 출력된다.

  따라서 테이블의 인덱스는 사용되지 않으며, 인덱스가 없거나 임의성 쿼리에 탁월한 성능을 발휘한다.

 

- 적은 행에 대해 인덱스가 있는 테이블에 대해서는 중첩루프조인이 사용될 가능성이 높다.

- 하지만 용량이 커지고 행수가 많아지면 중첩 루프 조인은 행수 만큼의 테이블 스캔이 발생하므로 매우 느린 방법이다. 이때 해시 조인이 발생한다.

 

연결고리

각 테이블의 연결고리의 인덱스는 사용하지 않는다!

대신 테이블에 대한 해시 버킷을 생성하며 그것을 통해 조인을 한다. 물론 조인이 되면 삭제된다. 그래서 반복적으로 명령을 수행할경우 매번 새로 생성합니다.

 

조인 결과

조인의 결과는 정렬하지 않는 상태로 출력된다. 그래서 특정 컬럼으로 정렬을 하고 싶다면 ORDER BY 절을 이용해야 합니다.

 

랜덤 액세스

랜덤 액세스가 있으나 중첩조인과는 달리 빠른 랜덤 액세스입니다.

 

메모리 사용

해시 버킷을 만들기 때문에 많은 메모리를 사용합니다.

 

 

 

 

출처 : http://blog.sonim1.com/108

728x90
반응형
loading