조인은 여러 테이블에 있는 정보를 긁어와 합쳐서 살펴보는 작업을 말한다. 조인이 내부적으로 실행되는 데에는 3가지 방법이 존재한다.
1️⃣ Nested Loop (NL)
첫 번째는 흔히 NL 조인이라고 부르는 Nested Loop다.
USE BaseballData;
SELECT TOP 5 *
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID
야구 관련 기록을 담아놓은 데이터베이스에서 선수 정보와 선수 연봉 정보를 조인했다. 5개의 정보를 보여달라고 하면,
SQL이 자동으로 중첩 루프 (Nested Loop)를 이용하여 조인을 하고 있다는 걸 알 수 있다. NL 조인은 2개 이상의 테이블이 있을 때 하나의 테이블을 기준으로 잡고 다른 테이블의 row를 맞춰보면서 결과물을 내는 방식이다. C#과 같은 코드에서 말하는 이중 루프와 비슷한 방식이라고 할 수 있다.
✅ 먼저 접근한 Outer 테이블의 row를 차례로 보고 Inner 테이블에는 랜덤하게 접근한다.
✅ Inner 테이블에 인덱스가 없으면 사용하지 않는다.
✅ 부분적인 범위를 처리할 때 유용하다. (ex. TOP 5 *)
2️⃣ Merge
결합 전 테이블을 정렬하고 조인하는 방식인 Merge 조인이다.
USE BaseballData;
SELECT *
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID
players와 salaries에 있는 모든 정보를 조인했다.
SQL은 각 테이블을 정렬(Sort)한 뒤 조인했다. Merge 조인은 조인할 대상이 너무 커서 랜덤한 접근을 방지하고 인덱스가 없을 때도 사용할 수 있는 조인이다. 데이터가 이미 정렬되어 있을 경우 (Clustered 정렬이 best) 매우 유용하다.
✅ 랜덤 없이 Scan을 사용하여 조인한다.
✅ Many-to-Many보단 One-to-Many에서 유용하다.
✅ 정렬할 데이터가 너무 많으면 Sort에서 매우 비효율적이다. (이럴 때는 Hash가 유용함)
3️⃣ Hash
임시적으로 해쉬 테이블을 만들어서 연결할 데이터들을 모아두는 방식인 Hash 조인이다.
USE BaseballData;
SELECT *
FROM salaries AS s
INNER JOIN teams AS t
ON s.teamID = t.teamID
인덱스가 없는 두 테이블을 조인했다.
Hash 값을 이용하여 테이블을 조인하는 방식이다. 임시적으로 Hash 테이블을 생성하여 테이블을 조인한다. 매우 큰 용량의 데이터를 조인할 때 랜덤 엑세스와 Sort를 하고 싶지 않다면 유용하게 사용할 수 있다.
✅ 인덱스가 없을 때 유용하다.
✅ 정렬이 필요없다.
✅ 랜덤 엑세스 위주가 아니다.
✅ 데이터가 적은 쪽을 HashTable로 만드는 게 좋다.
'공부 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] SQL 에러 상태: 실패 -테스트 실패: Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor (0) | 2024.03.28 |
---|---|
[데이터베이스] 정렬(Sort/Sorting) 줄이기 (0) | 2022.07.08 |
[데이터베이스] Transaction(트랜잭션)이란? (0) | 2022.07.07 |
[데이터베이스] 복합인덱스란? (0) | 2022.07.07 |
[데이터베이스] Clustered Index와 Non-Clustered Index (0) | 2022.07.02 |