-
Nested Loop 조인데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 18. 19:18
1. 조인의 종류
조인에는 3가지 종류가 있다.
1) Nested Loop (NL) 조인
2) Merge (병합) 조인
3) Hash(해시) 조인
조인을 하면 세 가지 상태 중 하나를 골라서 조인이 이루어진다.
그렇다면 세 가지 상태의 각 장단점은 어떤지 알아보기로 한다.
어떤 조인이 이루어지는지 실험USE BaseballData; -- Merge SELECT * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID -- NL SELECT TOP 5 * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID -- Hash SELECT * FROM salaries AS s INNER JOIN teams AS t ON s.teamID = t.teamID
OPTION(조인) 명령어를 이용하여 강제로 조인의 상태를 정할 수 있다.
-- Merge -> NL로 강제 설정 SELECT * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID OPTION(LOOP JOIN)
2. NL 조인
Nested Loop(NL)이란 두 개의 테이블이 있을 때 이중for문으로 외부 테이블에서 내부 테이블의 데이터들을 하나씩 비교해가면서 찾아보는 느낌의 루프이다.
특징으로는 외부의 데이터를 찾는 조건이 아무리 크고 복잡하다고 한들, 내부 테이블의 데이터를 찾는 조건이 간단하면 성능이 매우 좋아진다. 반대로 내부 테이블의 조건이 복잡하면 성능이 매우 떨어진다.
특히 TOP 구문이 있을 때 매우 유용한데 그 이유는 TOP구문으로 인해 내부 테이블의 조건이 단순해지기 때문이다.
결론부터 말하면 내부 테이블의 조건이 중요하다.
SELECT * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID OPTION(LOOP JOIN)
두 개의 테이블에서 Index Scan은 외부 테이블이고, Index Seek는 내부 테이블이다.
내부 테이블은 Index Scan보다 비교적 성능이 좋은 Index Seek이기 때문에 내부 조건이 단순하다고 생각할 수 있다.
참고로, DB자체에서 외부 테이블을 salaries로 잡고 내부 테이블을 players로 잡았는데 OPTION(FORCE ORDER, ...) 명령어를 통해서 강제로 외부 테이블을 players로 잡고 내부 테이블을 salaries로 잡을 수 있다. 딱히 중요한 내용은 아니다.
SELECT * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID OPTION(FORCE ORDER, LOOP JOIN)
'데이터베이스 with MSSQL > SQL 튜닝' 카테고리의 다른 글
Hash (0) 2022.04.19 Merge (0) 2022.04.19 복합 인덱스 컬럼 순서 (0) 2022.04.15 북마크 룩업 (0) 2022.04.15 Index Scan vs Index Seek (0) 2022.04.14