테이블에서 조인(Join) 이란?

두 개 이상의 테이블을 하나의 집합으로 만드는 연산이다. SQL문에서 FROM 절에 두 개 이상의 테이블이 나열될 경우 조인이 수행된다. 조인 연산은 두 테이블 사이에서 수행된다. FROM 절에 세 테이블 이상이 존재한다고 해도, 두 개씩 순차적으로 묶어서 조인이 수행될 것이다. 이때 조인 기법은 두 개의 테이블을 조인할 때 사용할 수 있는 방법이다.

 

NL 조인(Join)

Nested Loops 조인의 약어이며, 한 테이블의 각 행에 대해 다른 테이블의 모든 행을 검색하여 일치하는 행을 찾습니다. 이 방식은 한 쪽 테이블이 작고 다른 쪽 테이블이 크거나, 적절한 인덱스가 있는 경우 효율적이다. 특히 NL Join은 랜덤 방식으로 데이터를 액세스하기 때문에 처리 범위가 좁은 것이 유리하다. 일반적으로 선행 테이블(Outer Table)과 후행 테이블(Inner Table)로 나뉘어서 조작됩니다. 이 구조는 각 선행 테이블의 행에 대해 후행 테이블의 모든 행을 반복적으로 검색하는 방식으로 동작합니다. 보통 선행 테이블로 상대적으로 작은 테이블을 선택한다.

 

 

Sort Merge 조인(Join)

소트 머지 조인은 두 테이블의 조인 컬럼을 기준으로 각각 정렬한 다음, 두 테이블을 병합하면서 조인 조건에 맞는 행을 찾는다. 이 조인 방식은 두 테이블의 크기가 비슷하고 이미 정렬되어 있거나 정렬 비용이 적을 때 유리하다.

 

Sort Merge Join은 랜덤 엑세스로 NL Join에서 부담이 되던 넓은 범위의 데이터를 처리할 때 이용되던 조인 기법이다. 그러나 Sort Merge Join은 정렬할 데이터가 많아 메모리에서 모든 정렬 작업을 수행하기 어려운 경우에는 임시 영역(디스크)을 사용하기 때문에 성능이 떨어질 수 있다.

 

일반적으로 대량의 조인 작업에서 정렬 작업을 필요로 하는 Sort Merge Join보다는 CPU 작업 위주로 처리하는 Hash Join이 성능상 유리하다. 그러나 Sort Merge Join 은 Hash Join 과는 달리 동등 조인 뿐만 아니라 비동등 조인에 대해서도 조인 작업이 가능하다는 장점이 있다.

 

마지막으로, Sort Merge Join은 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있는 조인 기법이다.

 

 

 

Hash 조인(Join)

해시 조인은 먼저 조인할 테이블의 조인 컬럼을 기준으로 해시 테이블을 만들고, 다른 테이블의 조인 컬럼에 대한 해시를 계산하여 해시 테이블과 비교합니다. 이는 대량의 데이터를 빠르게 조인할 수 있게 해 줍니다. 특히, 메모리 내에서 해시 테이블을 완전히 구성할 수 있을 정도로 충분한 메모리가 있는 경우에 매우 빠른 성능을 보인다.

 

Hash Join은 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있는 조인 기법이다. Hash Join은 해쉬 함수를 이용하여 조인을 수행하기 때문에 '=' 로 수행하는 조인, 즉, 동등 조인에서만 사용할 수 있다. 해쉬 함수를 적용한 값은 어떤 값으로 해슁될 지 알 수 없다. 해쉬 함수가 적용될 때 동일한 값은 항상 같은 값으로 해슁됨이 보장된다. 그러나 해쉬 함수를 적용할 때 보다 큰 값이 항상 큰 값으로 해슁되고 작은 값이 항상 작은 값으로 해슁된다는 보장은 없다. 그렇기 때문에 Hash Join은 동등 조인(=)에서만 사용할 수 있다.

 

Hash Join은 조인 작업을 수행하기 위해 해쉬 테이블을 메모리에 생성해야 한다. 생성된 해쉬 테이블의 크기가 메모리에 적재할 수 있는 크기보다 더 커지면 임시 영역(디스크)에 해쉬 테이블을 저장한다. 그러면 추가적인 작업이 필요해 진다. 그렇기 때문에 Hash Join 을 할 때는 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다. 선행 테이블의 결과를 완전히 메모리에 저장할 수 있다면 임시 영역에 저장하는 작업이 발생하지 않기 때문이다.

 

Hash Join에서는 선행 테이블을 이용하여 먼저 해쉬 테이블을 생성한다고 해서 선행 테이블을 Build Input 이라고도 하며, 후행 테이블은 만들어진 해쉬 테이블에 대해 해쉬 값의 존재여부를 검사한다고 Prove Input 해서 이라고도 한다

'DataBase > SQLD' 카테고리의 다른 글

인덱스(Index)  (0) 2024.04.28
옵티마이저(Optimizer)  (1) 2024.04.28
절차형 SQL  (0) 2024.04.27
윈도우 함수(WINDOW 함수)  (2) 2024.04.26
그룹함수(Group Function)  (0) 2024.04.26

+ Recent posts