본문 바로가기
Resource/SQLD

[SQLD] 조인 (Join)

by 우창욱 2024. 2. 19.

Fastcampus 합격의 하이패스 : SQLD 자격 과정 강의를 들으면서 학습한 내용을 정리한 글입니다

 

합격의 하이패스 : SQLD 자격 과정 | 패스트캠퍼스

합격패스 : SQLD 자격 과정

fastcampus.co.kr

 

개념 정리

조인

조인은 두 개 이상의 테이블을 하나의 집합으로 만드는 연산을 의미합니다. SQL문의 FROM 절에 두 개 이상의 테이블 혹은 집합이 존재할 경우 조인이 수행됩니다. 특히 조인은 3개 이상의 테이블을 조인한다고 하더라도, 특정 시점에 2개의 테이블 단위로 조인이 됩니다. 각각의 조인 단계에서는 서로 다른 조인 기법이 사용될 수 있습니다.

 

ex) A, B 조인시 NL 조인 수행 + A, B 조인의 결과와 C를 조인 시 해시 조인 수행

 


NL(Nested Loops) 조인

특징 설명
Random Access 위주의 조인 NL 조인은 각 레코드를 순차적으로 처리합니다.
대량의 데이터를 조인할 경우 인덱스를 통한 Random Access가 많고 이는 전체적인 성능 저하로 이어질 수 있습니다.
NL 조인은 한 번에 한 레코드씩 순차적으로 처리한다.
NL 조인은 한 번에 한 레코드씩 순차적으로 처리합니다. 
조인되는 레코드의 범위를 가능한 한 좁혀서 처리하면, 더 효율적으로 조인을 수행할 수 있습니다.
Driving 테이블 (주로 외부 루프에서 처리되는 테이블)의 크기 및 처리 범위가 전체 조인 성능을 결정한다. 가능한 한 작은 테이블을 Driving 테이블로 선택하는 것이 성능에 유리합니다.
인덱스의 유무 및 구성에 크게 의존한다.  내부 테이블 (내부 루프에서 처리되는 테이블)에서 인덱스를 통한 접근 방식이 성능에 결정적인 영향을 미칩니다.
소량의 데이터 처리나 부분 범위 처리를 필요로 하는 온라인 트랜잭션 처리 (OLTP, Online Transaction Processing) 환경에서 잘 작동한다. OLTP 시스템이 일반적으로 요구하는 빠른 응답시간과 효율적인 데이터 처리 요구사항에 부합하기 때문입니다.
작은 집합이 Driving 테이블이 되어야 하고, Inner 테이블의 인덱스 스캔이 매우 중요하다. 이 방식은 조인 과정에서 필요한 데이터 접근과 처리량을 최소화하여 전체 성능을 향상시킵니다.

 

Sort-Merge 조인

특징 설명
정렬 작업을 생략할 수 있는 인덱스가 존재하는 경우 사용한다. 이미 정렬된 인덱스가 존재한다면, Sort-Merge 조인에서는 이를 활용하여 별도의 정렬 과정 없이 바로 병합 단계로 넘어갈 수 있습니다.
정렬된 인덱스가 존재한다면, 처리 시간을 단축시키는 데 도움이 됩니다.
실시간으로 인덱스를 생성한다. 인덱스가 없는 경우, 양쪽 집합을 먼저 정렬하고 나서 NL 조인과 유사한 방식으로 데이터를 처리할 수 있습니다.
정렬된 데이터를 기반으로 더 효율적인 조인을 가능하게 합니다.
인덱스 유무에 영향을 받지 않는다. Sort-Merge 조인은 인덱스의 유무에 크게 의존하지 않습니다. 
인덱스가 없는 경우에도 두 데이터 집합을 정렬하여 조인을 수행할 수 있습니다.
양쪽 집합을 개별적으로 읽고 나서 조인한다. 조인 컬럼에 인덱스가 없는 상황에서도 Sort-Merge 조인은 두 테이블을 독립적으로 읽고 정렬하여 조인 대상 집합을 줄일 수 있습니다.
이는 큰 데이터 집합에서 조인을 수행할 때 특히 유리할 수 있습니다.
스캔 위주의 액세스 방식이다.
양쪽 소스 집합에서 정렬 대상 레코드를 찾는 작업이 스캔을 통해 이루어집니다.
필요한 경우 인덱스를 이용한 랜덤 액세스 방식으로 처리될 수 있습니다.

 

해시 조인

특징 설명
대량의 데이터 처리가 필요하고 쿼리 수행 시간이 오래 걸리는 대용량 테이블을 조인할 때 사용한다. 배치 프로그램, 데이터 웨어하우스(DW), 온라인 분석 처리(OLAP, Online Analytical Processing) 쿼리대용량 데이터를 처리 해야할 경우 해시 조인이 효과적입니다.
NL 조인과 달리 Random Access 부하가 없다. 해시 조인이 메모리 내 해시 테이블을 사용하여 조인을 수행하기 때문에, 디스크 I/O 작업이 상대적으로 적어서 처리 속도가 빠릅니다.
Sort-Merge 조인과 달리 정렬 부하가 없다. 데이터를 해시 테이블에 저장하는 과정에서 자연스럽게 조인에 필요한 구조가 만들어지기 때문에, 별도의 정렬 과정이 필요 없어 처리 효율이 높습니다.
해시 테이블을 생성하는 비용에 따라, Build Input이 충분히 작을 때 효과적이다. 해시 조인은 두 테이블 중 하나를 메모리 내에 해시 테이블로 생성 (Build Input)하고, 다른 하나는 이 해시 테이블을 조회하며 조인을 수행(Probe Input)합니다. 
해시 테이블을 생성하고 유지하는 데 필요한 메모리 공간이 충분히 확보되어 있어야 효과적으로 작동합니다.
작은 집합을 Build Input 으로 하고 큰 집합을 Probe Input 으로 하는 것이 중요하다. 해시 조인을 효율적으로 수행하기 위해서는 상대적으로 작은 테이블을 해시 테이블로 생성하는 Build Input 으로 사용하고, 큰 테이블을 조회하는 Probe Input 으로 사용하는 것이 중요합니다.

 

조인 기법 비교

이름 특징 사용 사례
NL 조인 순차적인 Random Access 이다. OLTP
Random Access 부하가 발생할 수 있다.
조인 조건이 중요하다.
조인의 방향성이 명확해서, 작은 테이블에서 큰 테이블로의 조인이나, 효율적인 인덱스 사용이 가능할 때 유리하다.
특정 조건에 따라 부분적인 범위만 처리가 가능하다.
Sort-Merge 조인 두 테이블을 동시에 처리한다. -
전체 데이터 범위에 대해 조인을 수행한다.
(특정 조건에 따라 데이터의 일부분을 제외하고 조인하는 것도 가능하다.)
조인 조건의 복잡성에 영향을 받지 않는다.
NL 조인처럼 명확한 Driving 테이블이 없어 조인 방향성이 없다.
조인 수행 전 두 테이블을 정렬해야 하므로 정렬 과정에서 부하가 발생할 수 있다.
정렬이 주로 PGA(Program Global Area) 에서 수행되므로, PGA의 과다 사용이 우려될 수 있다.
해시 조인 해시 영역 크기(Hash Area Size)가 중요하다. 해시 영역의 크기가 크면 메모리 내 전체 조인이 이루어질 수 있어서 성능이 크게 향상된다. OLAP
등치 조인이 매우 중요하다.
대량 범위를 처리할 때 유리하다.
배치, SP(Stored Procedure) 처리에 유리하다.

 

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

[SQLD] SQL 기본  (0) 2024.02.24
[SQLD] 데이터 모델과 성능  (0) 2024.02.21
[SQLD] 데이터 모델링의 이해  (0) 2024.02.19
[SQLD] 인덱스  (0) 2024.02.18
[SQLD] 윈도우 함수  (0) 2024.02.13