본문 바로가기
DB/MSSQL (SQLSERVER)

[MSSQL] SQL 쿼리 튜닝 -> 조인(JOIN)로 답을 찾자!(NESTED LOOP JOIN (중첩반복),SORT MERGE JOIN (정렬병합),HASH JOIN (해시매치))

by 커져라불어라 2020. 7. 15.
반응형

안녕하세요 투자하는 개발자 투개자입니다.


저번글에선 실행계획과 인덱스를 공부해 SQL쿼리를 튜닝하는 방법에 대해 알려드렸는데요.

https://in-harvey-it.tistory.com/6


오늘은 조인을 통해 SQL쿼리를 튜닝하는 방법에 대해 알아보겠습니다!


조인의 방식은 3가지로 구분됩니다.


1. NESTED LOOP JOIN (중첩반복)

2. SORT MERGE JOIN (정렬병합)

3. HASH JOIN (해쉬매치)


우리가 흔히들 알고 있는 INNER, LEFT OUTER, RIGHT OUTER JOIN은 조인의 종류이고

위의 3가지는 내부적으로 실행되는 조인의 방식입니다.


즉 조인의 종류는 논리적이고 조인의 방식은 물리적입니다.


1. NESTED LOOP JOIN (중첩반복)


바깥 테이블의 처리 범위를 하나씩 접근하면서 추출된 값으로 테이블을 조인하는 방식입니다.

FOR문을 돈다고 생각하시면 좀 더 쉽게 접근하실 수 있습니다.


특징

1. 순차적으로 처리

2. 순차적으로 돌기 떄문에 안쪽 테이블에 인덱스 필요

3. 메모리 사용량이 가장 적음

4. 두 테이블의 랜덤 I/O가 높게 나옴


SELECT * FROM [스키마명].[테이블명] AS 별명1
INNER LOOP JOIN [후행테이블] AS 별명2 ON 별명1.키 = 별명2.
cs


SELECT * FROM [스키마명].[테이블명] AS 별명1
INNER JOIN [후행테이블] AS 별명2 ON 별명1.키 = 별명2.키
OPTION (LOOP JOIN)
cs


2. SORT MERGE JOIN (정렬병합)


양쪽 테이블의 처리 범우를 각자 접근하여 정렬한 결과를 차례로 스캔 -> 연결고리 조건으로 병합하는 방식입니다.

경우에 따라 LOOP JOIN보다 훨씬 빠를 수도 있고, 랜덤 엑세스가 줄어들어 시스템 부하를 감소시킵니다.


특징

1. 동시처리

2. 인덱스 필요

3. 정렬에 따라 메모리 사용량이 증가합니다.


SELECT * FROM [스키마명].[테이블명] AS 별명1
INNER MERGE JOIN [후행테이블] AS 별명2 ON 별명1.키 = 별명2.키

cs


SELECT * FROM [스키마명].[테이블명] AS 별명1
INNER JOIN [후행테이블] AS 별명2 ON 별명1.키 = 별명2.키
OPTION (MERGE JOIN)
cs


3. HASH JOIN (해시매치)


조인할 테이블에 대해서 해시 버킷을 생성, 순서대로 결과가 출력됩니다.


특징

1. 인덱스 필요없음

2. 대용량 테이블에 유리

3. 정렬하지 않은 상태로 출력

4. 메모리 사용


SELECT * FROM [스키마명].[테이블명] AS 별명1
INNER HASH JOIN [후행테이블] AS 별명2 ON 별명1.키 = 별명2.키

cs


SELECT * FROM [스키마명].[테이블명] AS 별명1
INNER JOIN [후행테이블] AS 별명2 ON 별명1.키 = 별명2.키
OPTION (HASH JOIN)
cs


내부적으로 발생하는 조인의 방식에 따라 쿼리 성능이 달라질 수 있으니, 각 특징을 기억해두고, 이를 사용해보시기 바랍니다.

감사합니다.

반응형