[데이터베이스] JOIN(조인) : Nested Loop, Merge, Hash

2022. 7. 8. 14:11·공부/데이터베이스
728x90

조인은 여러 테이블에 있는 정보를 긁어와 합쳐서 살펴보는 작업을 말한다. 조인이 내부적으로 실행되는 데에는 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로 만드는 게 좋다.

728x90

'공부 > 데이터베이스' 카테고리의 다른 글

[데이터베이스] 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
'공부/데이터베이스' 카테고리의 다른 글
  • [데이터베이스] SQL 에러 상태: 실패 -테스트 실패: Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
  • [데이터베이스] 정렬(Sort/Sorting) 줄이기
  • [데이터베이스] Transaction(트랜잭션)이란?
  • [데이터베이스] 복합인덱스란?
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (239)
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    unity
    코딩
    네트워크
    Python
    C
    게임서버
    백준
    C언어
    EntityFramework
    Entityfamework
    C#
    디자인패턴
    tcp
    java
    HTML
    라즈베리파이
    coding
    유니티
    EFCore
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[데이터베이스] JOIN(조인) : Nested Loop, Merge, Hash
상단으로

티스토리툴바