DB

[Two-way Join] 해시조인 (Hash Join)

타우루스 2025. 9. 14. 16:27

데이터베이스의 중요한 개념 중 하나인 해시 조인(Hash Join)에 대해 알아볼께요.

 

📚 해시 조인 학습 계획 📚

  1. 1단계: 해시 조인이란? (기본 개념 잡기)
    • 두 개의 큰 데이터 테이블을 합칠 때 사용하는 똑똑한 방법이에요. 도서관에서 책을 찾는 비유로 쉽게 알아봐요.
  2. 2단계: 해시 조인의 작동 원리 (빌드 & 프로브 단계)
    • 컴퓨터가 실제로 해시 조인을 수행하는 비밀스러운 두 단계, '해시 테이블 만들기(Build)'와 '짝꿍 찾기(Probe)' 과정을 파헤쳐 볼 거예요.
  3. 3단계: 해시 조인의 장점과 단점 (언제 사용하면 좋을까?)
    • 해시 조인이 언제 가장 강력한 힘을 발휘하는지, 그리고 어떤 점을 주의해야 하는지 알아볼게요.

 

1단계: 해시 조인이란? (기본 개념 잡기)

혹시 엄청나게 많은 학생 명단이 들어있는 두 개의 엑셀 파일(A파일, B파일)을 합쳐야 한다고 상상해 본 적 있나요? 두 파일에 모두 이름이 있는 학생만 골라내고 싶을 때, 어떻게 하면 가장 빠를까요?

 

A파일의 학생 이름을 한 명씩 보면서, B파일 전체를 처음부터 끝까지 다 찾아보는 건 너무 오래 걸리겠죠? 😫

 

해시 조인은 바로 이럴 때 쓰는 아주 영리한 방법이에요!

 

핵심 아이디어는 이렇습니다.

두 개의 테이블 중 더 작은 테이블을 가지고 미리 '정리된 목차(해시 테이블)'를 만들어 둬요. 그리고 큰 테이블을 읽으면서 그 목차를 바로바로 찾아보는 거죠!

 

마치 거대한 도서관에서 책을 찾을 때, 책장 하나하나를 다 뒤지는 게 아니라 '도서 검색대'에서 책 위치를 바로 찾아서 가는 것과 같아요. 여기서 '도서 검색대'가 바로 해시 테이블의 역할이랍니다.

 

이 방법은 특히 대용량의 데이터를 다룰 때 아주 빠르고 효율적이어서 데이터베이스에서 정말 사랑받는 조인 방식이에요.

 

활동을 통해 개념을 익힐 수 있는 재미있는 시나리오가 하나 있어요.

🎭 학습 활동: 파티 플래너가 되어보자! 🎭

당신은 연말 파티를 준비하는 파티 플래너예요. 당신 손에는 두 개의 명단이 있습니다.

  • 명단 A (초대장 발송 명단): 500명의 이름이 적힌 긴~ 명단.
  • 명단 B (참석 회신 명단): 100명의 이름이 적힌 짧은 명단.

당신의 임무는 초대장을 보낸 사람(명단 A) 중에서 실제로 참석하겠다고 회신한 사람(명단 B)이 누구인지 빠르게 확인하는 것입니다.

 

두 가지 방법이 있어요.

  • 방법 1 (무식한 방법 🐢): 명단 A의 첫 번째 사람을 보고, 명단 B 전체(100명)를 훑어보며 이름이 있는지 찾는다. 다시 명단 A의 두 번째 사람을 보고, 명단 B 전체(100명)를 또 훑어본다. 이렇게 명단 A의 500명에 대해 반복한다.
  • 방법 2 (똑똑한 방법 🐇): 먼저 더 짧은 명단 B (100명)를 가지고 이름의 첫 자음별로('ㄱ' 서랍, 'ㄴ' 서랍...) 카드를 정리해서 서랍장에 넣어둔다. 그 후, **긴 명단 A (500명)**를 한 명씩 보면서 해당 자음 서랍만 열어서 이름이 있는지 바로바로 확인한다.

🕵️‍♂️ 퀴즈:

당신이 효율적인 파티 플래너라면, 왜 '방법 2'를 선택해야 할까요? 이 방법의 속도를 미친 듯이 빠르게 만들어주는 핵심적인 '준비물'은 무엇일까요?

더보기

정답 : "이름의 첫 자음별로 정리해 둔 서랍장"이에요! 🗄️✨

 

왜 그럴까요?

 

방법 1은 명단 A의 한 사람을 찾을 때마다 명단 B의 100명 전체와 일일이 비교해야 해요. 이걸 500명에 대해 반복해야 하니, 컴퓨터가 계산하는 횟수는 대략 500번 X 100번 = 50,000번이나 된답니다. 😱

 

하지만 방법 2는 처음에 명단 B(100명)를 가지고 서랍장을 만드는 수고를 딱 한 번만 하면, 그 다음부터는 명단 A의 500명을 찾을 때 전체를 다 뒤질 필요 없이 해당 자음의 서랍만 '쏙' 열어보면 되죠. 비교 횟수가 비교도 안 되게 줄어들어요!

 

이 똑똑한 '서랍장'이 바로 해시 조인에서 사용하는 해시 테이블(Hash Table)이랍니다. 먼저 작은 테이블로 해시 테이블이라는 잘 정리된 목차를 만들어 놓고(이것을 빌드(Build) 단계라고 해요!), 그 다음 큰 테이블을 보면서 목차에서 바로바로 찾아보는 거죠(이것을 프로브(Probe) 단계라고 하고요!).

 

 

다음 단계로 넘어가 보죠. 🚀

 

방금 파티 플래너 활동에서 우리가 '참석자 명단으로 서랍장을 만들고(준비)', '초대장 명단을 보며 서랍장을 찾아본(실행)' 두 가지 행동을 했죠? 컴퓨터도 똑같이 두 단계로 나눠서 일을 해요. 바로 빌드(Build) 단계프로브(Probe) 단계랍니다.

 

2단계: 해시 조인의 작동 원리 (빌-드 & 프-로브)

1. 빌드 (Build) 단계: 똑똑한 목차 만들기 🏗️

이 단계는 준비 단계예요. 컴퓨터는 두 개의 테이블 중 더 작은 테이블을 선택해요. (이게 아주 중요해요! 왜냐하면 메모리에 올려야 해서 작을수록 좋거든요.)

그리고 그 작은 테이블의 데이터를 가지고 메모리(컴퓨터의 아주 빠른 작업 공간) 위에 **'해시 테이블'**이라는 검색 목차를 착착착 만들어 놓습니다.

  • 파티 플래너 비유: 더 짧은 '참석 회신 명단(100명)'을 가지고 '이름 자음별 서랍장'을 만드는 과정과 똑같아요.

이때 컴퓨터는 '해시 함수(Hash Function)'라는 마법 같은 규칙을 사용해요. 이 규칙은 데이터가 해시 테이블의 어느 위치(어느 서랍)로 가야 할지 순식간에 계산해 준답니다.

2. 프로브 (Probe) 단계: 목차에서 짝꿍 찾기 🕵️‍♀️

이제 실행 단계예요. 해시 테이블이 준비되었으니, 컴퓨터는 더 큰 테이블을 처음부터 한 줄씩 읽기 시작해요.

그리고 큰 테이블의 데이터에 아까와 똑같은 '해시 함수' 규칙을 적용해요. 그러면 '아, 이 데이터의 짝꿍은 아까 만든 해시 테이블의 3번 서랍에 있겠구나!' 하고 바로 알 수 있죠.

  • 파티 플래너 비유: '초대장 발송 명단(500명)'에 있는 "김민준"을 보고, "ㄱ" 서랍만 열어서 이름이 있는지 확인하는 과정이에요.

그 위치(서랍)로 가서 데이터가 정말 일치하는지 최종 확인하고, 짝이 맞으면 두 데이터를 예쁘게 합쳐서 우리에게 보여주는 거랍니다!


이 두 단계, '빌드'와 '프로브'에 대한 설명이 이해되시나요?

 

✍️ 퀴즈:

해시 조인에서 '빌드(Build)' 단계, 즉 해시 테이블을 만들 때는 둘 중 어떤 테이블을 사용할까요?

  1. 더 큰 테이블
  2. 더 작은 테이블
더보기

정답 : 2번, '더 작은 테이블'

 

그 이유는 '빌드' 단계에서 만드는 해시 테이블은 컴퓨터의 빠릿빠릿한 작업 공간인 '메모리'에 만들어지기 때문이에요. 당연히 더 작은 테이블을 올려야 메모리를 아낄 수 있고, 작업 속도도 훨씬 빨라지겠죠?

 

만약 큰 테이블을 올리려고 하면 메모리가 부족해서 작업이 아주 복잡하고 느려질 수 있답니다. 그래서 데이터베이스는 항상 작은 테이블을 선택하는 똑똑함을 발휘해요. 😉

이제 우리는 해시 조인이라는 강력한 도구를 언제, 어떻게 사용해야 하는지 배울 시간이에요. 모든 도구가 그렇듯, 상황에 맞게 써야 최고의 효과를 낼 수 있겠죠?

 

3단계: 해시 조인의 장점과 단점

해시 조인의 장점 (이럴 때 최고예요! 👍)

  1. 대용량 데이터 처리에 효과적: 두 테이블이 모두 클 때, 특히 비교할 데이터가 정렬되어 있지 않을 때 아주 빠른 속도를 보여줘요. 수백만 건의 데이터를 합치는 작업도 척척 해낸답니다!
  2. 등호(=) 조건에서 최강의 성능: 해시 조인은 '학생 테이블의 학번' = '수강신청 테이블의 학번'처럼 두 값이 정확히 같을 때 짝을 찾는 작업에 특화되어 있어요. 이런 '동등 조인(Equi Join)'에서는 거의 적수가 없답니다.
  3. 데이터 정렬이 필요 없음: 어떤 조인 방식(예: 소트 머지 조인)은 데이터를 합치기 전에 먼저 정렬해야 해서 시간이 더 걸려요. 하지만 해시 조인은 정렬 과정이 필요 없어서 준비 시간이 더 짧죠.

해시 조인의 단점 (이럴 땐 조심해요! ⚠️)

  1. 메모리를 많이 사용함: 가장 큰 특징이자 단점이에요. '빌드' 단계에서 작은 테이블을 통째로 메모리에 올려 해시 테이블을 만들어야 하죠. 만약 작은 테이블마저도 너무 커서 메모리에 다 안 올라가면 성능이 급격히 나빠질 수 있어요.
  2. 등호(=) 조건에서만 작동: 'A > B' 나 'A < B' 같은 부등호 조건이나 특정 범위('BETWEEN')를 찾는 조건에서는 해시 조인을 사용할 수 없어요. 오직 '같다'는 조건에서만 그 위력을 발휘한답니다.

 

📝 최종 퀴즈: 데이터베이스 전문가의 선택!

당신은 데이터 분석가입니다. 지금 두 개의 큰 테이블을 조인해야 하는 상황이에요.

  • TRANSACTIONS (거래 내역) 테이블: 1억 건의 데이터
  • CUSTOMERS (고객 정보) 테이블: 100만 건의 데이터

두 테이블의 customer_id가 서로 같은(=) 데이터를 합쳐서, 거래마다 어떤 고객의 거래인지 알아내려고 합니다. 당신의 컴퓨터는 메모리가 넉넉한 편입니다.

 

이 상황에서 데이터베이스는 '해시 조인'을 사용할 가능성이 매우 높습니다. 다음 해시 조인에 대한 설명 중, 가장 옳지 않은 것은 무엇일까요?

  1. 두 테이블이 모두 크고 정렬되어 있지 않기 때문에 해시 조인을 사용하는 것이 효율적이다.
  2. '빌드(Build)' 단계에서는 더 큰 테이블인 TRANSACTIONS (1억 건)를 사용하여 메모리에 해시 테이블을 생성할 것이다.
  3. customer_id가 서로 '같다'는 등호(=) 조건을 사용하기 때문에 해시 조인이 사용되기에 적합한 환경이다.
  4. 만약 '고객의 나이 > 거래 금액' 같은 부등호(<, >) 조건으로 조인해야 했다면 해시 조인은 사용할 수 없었을 것이다.
더보기

정답 : 2번

 

✨ 퀴즈 해설

  • 정답인 이유 (왜 2번이 틀렸나?): 해시 조인의 '빌드' 단계에서는 메모리를 효율적으로 사용하기 위해 반드시 두 테이블 중 더 작은 테이블을 사용해요. 이 경우에는 1억 건의 TRANSACTIONS 테이블이 아니라, 100만 건의 CUSTOMERS 테이블로 해시 테이블을 만들게 됩니다. 핵심을 정확히 꿰뚫어 보셨네요!

  • 다른 보기들이 옳은 이유:
    • 1번: 해시 조인은 두 테이블이 모두 클 때 아주 좋은 성능을 내요. 옳은 설명입니다.
    • 3번: 해시 조인은 등호(=) 조건에서 최적의 성능을 발휘해요. 옳은 설명입니다.
    • 4번: 해시 조인은 부등호(<, >) 조건에서는 사용할 수 없어요. 옳은 설명입니다.

 

오늘 배운 내용을 요약 하면,

 

  • 해시 조인이란 대용량 데이터를 합칠 때 사용하는 똑똑한 방법이라는 것.
  • 작은 테이블로 메모리에 해시 테이블을 만드는 '빌드(Build)' 단계와, 큰 테이블을 읽으며 해시 테이블을 참조하는 '프로브(Probe)' 단계로 작동한다는 것.
  • 등호(=) 조건대용량 데이터에 강하지만, 메모리 사용량이 많고 부등호 조건에는 약하다는 장단점까지!

오늘 학습이 도움이 되셨나요?

 

데이터베이스나 다른 과학, 학문적 주제에 대해 궁금한 점이 있으시면 댓글 달아 주세요.