λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN (ν•΄μ‹œ 쑰인)에 λŒ€ν•˜μ—¬

by 5566 2023. 8. 11.

λͺ©μ°¨:

1. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 κ°œλ…

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” 쑰인 μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λ‘œ, ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 효율적으둜 두 개의 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜λŠ” 방법이닀.

2. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 λ™μž‘ 원리

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 두 개의 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 λ‹¨κ³„λ‘œ λ™μž‘ν•œλ‹€. - 첫 번째 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 읽어와 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 톡해 ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•œλ‹€. - 두 번째 ν…Œμ΄λΈ”μ˜ 각 행을 읽어와 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 톡해 ν•΄μ‹œ 값을 κ³„μ‚°ν•œ ν›„, ν•΄λ‹Ή ν•΄μ‹œ 값을 가진 ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷에 μ €μž₯ν•œλ‹€. - ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷에 μ €μž₯된 κ°’λ“€κ³Ό 두 번째 ν…Œμ΄λΈ”μ˜ ν˜„μž¬ 행을 λΉ„κ΅ν•˜μ—¬ 쑰인 κ²°κ³Όλ₯Ό μƒμ„±ν•œλ‹€.

3. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 μž₯점

- λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 있으며, 큰 ν…Œμ΄λΈ”μ„ μœ„ν•œ λ””μŠ€ν¬ I/O λΉ„μš©μ„ 쀄일 수 μžˆλ‹€. - ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— 쑰인 μ„±λŠ₯이 O(1)에 κ°€κΉŒμš°λ©°, λΉ λ₯Έ μ†λ„λ‘œ 쑰인 κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

4. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 단점

- λ©”λͺ¨λ¦¬ μš©λŸ‰μ— 따라 쑰인 μ„±λŠ₯이 크게 μ’Œμš°λ˜λ―€λ‘œ, λ©”λͺ¨λ¦¬ μ œμ•½μ΄ μžˆλŠ” ν™˜κ²½μ—μ„œλŠ” μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆλ‹€. - 쑰인할 ν…Œμ΄λΈ” 쀑 ν•˜λ‚˜κ°€ μž‘μ€ κ²½μš°μ—λŠ” λ‹€λ₯Έ 쑰인 μ•Œκ³ λ¦¬μ¦˜λ³΄λ‹€ μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€. - ν•΄μ‹œ ν…Œμ΄λΈ” 생성에 ν•„μš”ν•œ 좔가적인 계산 λΉ„μš©μ΄ λ°œμƒν•œλ‹€.

5. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 μ‚¬μš© 사둀 및 μ˜ˆμ‹œ

- λŒ€μš©λŸ‰μ˜ ν…Œμ΄λΈ” μ‘°μΈμ—μ„œ ν•΄μ‹œ 쑰인은 많이 μ‚¬μš©λ˜λ©°, 데이터 μ›¨μ–΄ν•˜μš°μŠ€μ™€ OLAP μ‹œμŠ€ν…œμ—μ„œ 효과적으둜 ν™œμš©λœλ‹€. - 예λ₯Ό λ“€μ–΄, 고객 정보와 μ£Όλ¬Έ 정보λ₯Ό μ‘°μΈν•˜λŠ” κ²½μš°μ— ν•΄μ‹œ 쑰인을 μ‚¬μš©ν•˜μ—¬ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€. - λ˜ν•œ, 볡수의 ν…Œμ΄λΈ”μ„ λ™μ‹œμ— 쑰인해야 ν•˜λŠ” κ²½μš°μ—λ„ ν•΄μ‹œ 쑰인을 ν™œμš©ν•˜μ—¬ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€.

1. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 κ°œλ…

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” 쑰인 μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λ‘œ, ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 효율적으둜 두 개의 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

쑰인 연산은 보톡 두 개의 ν…Œμ΄λΈ”μ„ μ—°κ²°ν•˜μ—¬ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μ–»λŠ” μž‘μ—…μž…λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” 일반적으둜 두 개의 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κΈ° μœ„ν•΄ Nested Loop Joinμ΄λ‚˜ Sort-Merge Joinκ³Ό 같은 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν•΄μ‹œ 기반의 쑰인 μ•Œκ³ λ¦¬μ¦˜μΈ λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 더 효율적인 μž‘μ—… 처리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λ¨Όμ € ν•œ ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 읽어와 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•©λ‹ˆλ‹€. 그리고 λ‚˜λ¨Έμ§€ ν…Œμ΄λΈ”μ˜ 각 행을 읽어와 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 톡해 ν•΄μ‹œ 값을 κ³„μ‚°ν•œ λ’€, ν•΄λ‹Ή ν•΄μ‹œ 값을 가진 ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷에 μ €μž₯ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷에 μ €μž₯된 κ°’λ“€κ³Ό 두 번째 ν…Œμ΄λΈ”μ˜ ν˜„μž¬ 행을 λΉ„κ΅ν•˜μ—¬ 쑰인 κ²°κ³Όλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— 쑰인 μ„±λŠ₯이 O(1)에 κ°€κΉŒμš°λ©°, λΉ λ₯Έ μ†λ„λ‘œ 쑰인 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 μžˆμ–΄ 큰 ν…Œμ΄λΈ”μ„ μœ„ν•œ λ””μŠ€ν¬ I/O λΉ„μš©μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λŒ€μš©λŸ‰μ˜ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κ±°λ‚˜ 데이터 μ›¨μ–΄ν•˜μš°μŠ€μ™€ OLAP μ‹œμŠ€ν…œμ—μ„œ 효과적으둜 μ‚¬μš©λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λ©”λͺ¨λ¦¬ μš©λŸ‰μ— 따라 쑰인 μ„±λŠ₯이 크게 μ’Œμš°λ˜λ―€λ‘œ, λ©”λͺ¨λ¦¬ μ œμ•½μ΄ μžˆλŠ” ν™˜κ²½μ—μ„œλŠ” μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 쑰인할 ν…Œμ΄λΈ” 쀑 ν•˜λ‚˜κ°€ μž‘μ€ κ²½μš°μ—λŠ” λ‹€λ₯Έ 쑰인 μ•Œκ³ λ¦¬μ¦˜λ³΄λ‹€ μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 있으며, ν•΄μ‹œ ν…Œμ΄λΈ” 생성에 ν•„μš”ν•œ 좔가적인 계산 λΉ„μš©μ΄ λ°œμƒν•œλ‹€λŠ” 단점도 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 효율적인 쑰인 μ•Œκ³ λ¦¬μ¦˜μ„ μ„ νƒν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ˜ νŠΉμ„±κ³Ό 쑰인할 ν…Œμ΄λΈ”μ˜ 크기λ₯Ό κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

2. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 λ™μž‘ 원리

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 두 개의 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 λ‹¨κ³„λ‘œ λ™μž‘ν•©λ‹ˆλ‹€.

  1. 첫 번째 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 읽어와 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 톡해 ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•©λ‹ˆλ‹€.

    • ν•΄μ‹œ ν•¨μˆ˜λŠ” 각 ν–‰μ˜ 쑰인 컬럼 값을 μž…λ ₯으둜 λ°›μ•„ ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜μ—¬ κ³ μœ ν•œ ν•΄μ‹œ 값을 μƒμ„±ν•©λ‹ˆλ‹€.
    • ν•΄μ‹œ ν•¨μˆ˜λŠ” 쑰인 컬럼 값이 같은 경우 항상 λ™μΌν•œ ν•΄μ‹œ 값을 λ°˜ν™˜ν•΄μ•Ό ν•˜λ©°, ν•΄μ‹œ ν•¨μˆ˜μ˜ 좜λ ₯ λ²”μœ„λŠ” ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷 κ°œμˆ˜μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  2. 두 번째 ν…Œμ΄λΈ”μ˜ 각 행을 읽어와 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 톡해 ν•΄μ‹œ 값을 κ³„μ‚°ν•œ ν›„, ν•΄λ‹Ή ν•΄μ‹œ 값을 가진 ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷에 μ €μž₯ν•©λ‹ˆλ‹€.

    • ν•΄μ‹œ 값은 쑰인 컬럼 값을 μž…λ ₯으둜 λ°›μ•„ ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜μ—¬ μƒμ„±ν•©λ‹ˆλ‹€.
    • ν•΄μ‹œ ν…Œμ΄λΈ”μ€ 버킷과 μ—°κ²° 리슀트둜 κ΅¬μ„±λ˜λ©°, 버킷 λ²ˆν˜ΈλŠ” ν•΄μ‹œ 값을 ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷 개수둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ‘œ κ²°μ •λ©λ‹ˆλ‹€.
    • λ™μΌν•œ 버킷에 μ—¬λŸ¬ 개의 값이 μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷에 μ €μž₯된 κ°’λ“€κ³Ό 두 번째 ν…Œμ΄λΈ”μ˜ ν˜„μž¬ 행을 λΉ„κ΅ν•˜μ—¬ 쑰인 κ²°κ³Όλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

    • λ²„ν‚·μ—λŠ” ν•΄λ‹Ή ν•΄μ‹œ 값에 λŒ€μ‘ν•˜λŠ” 첫 번째 ν…Œμ΄λΈ”μ˜ 행듀이 μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • 두 번째 ν…Œμ΄λΈ”μ˜ 행을 μ½μ–΄μ˜¬ λ•Œλ§ˆλ‹€, ν•΄λ‹Ή ν•΄μ‹œ 값을 ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œ κ²€μƒ‰ν•˜μ—¬ 같은 ν•΄μ‹œ 값에 λŒ€μ‘ν•˜λŠ” 첫 번째 ν…Œμ΄λΈ”μ˜ ν–‰λ“€κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.
    • 쑰인 쑰건을 λ§Œμ‘±ν•˜λŠ” 경우, 쑰인 결과둜 μ„ νƒλ˜μ–΄ λ°˜ν™˜λ©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ΄μš©ν•˜μ—¬ 효율적으둜 쑰인을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ΄μš©ν•˜λŠ” μ΄μœ λŠ” ν•΄μ‹œ 값에 λŒ€μ‘ν•˜λŠ” 버킷을 μ°ΎλŠ” 과정이 O(1)에 κ°€κΉŒμš΄ μ‹œκ°„μ— 이루어지기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜κ³  κ²€μƒ‰ν•˜λŠ” λ‹¨κ³„μ—μ„œ 큰 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 ν•œ 번만 μ½μ–΄μ˜€λ©΄ λ˜λ―€λ‘œ, λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•˜κ³  λ””μŠ€ν¬ I/O λΉ„μš©μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 λΉ λ₯Έ μ†λ„λ‘œ 쑰인 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

3. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 μž₯점

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λ‹€μŒκ³Ό 같은 μž₯점을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

1. λΉ λ₯Έ 속도:

  • ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— 쑰인 μ„±λŠ₯이 O(1)에 κ°€κΉŒμ›Œ 맀우 λΉ λ₯Έ μ†λ„λ‘œ 쑰인 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 큰 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 ν•œ 번만 μ½μ–΄μ˜€λ©΄ λ˜λ―€λ‘œ λ””μŠ€ν¬ I/O λΉ„μš©μ„ 많이 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 특히 λŒ€μš©λŸ‰μ˜ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜λŠ” κ²½μš°μ— νš¨κ³Όμ μž…λ‹ˆλ‹€.

2. λ©”λͺ¨λ¦¬ 효율:

  • ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜λ―€λ‘œ, 쑰인에 ν•„μš”ν•œ λ°μ΄ν„°λ§Œμ„ λ©”λͺ¨λ¦¬μ— μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ”°λΌμ„œ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 있고, λ©”λͺ¨λ¦¬ μš©λŸ‰μ— 따라 쑰인 μ„±λŠ₯이 크게 μ’Œμš°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 큰 ν…Œμ΄λΈ”μ„ 쑰인해야 ν•˜λŠ” κ²½μš°μ—λ„ λ©”λͺ¨λ¦¬ μ œμ•½μ΄ μžˆλŠ” ν™˜κ²½μ—μ„œλ„ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. μŠ€μΊ” λΉ„μš© κ°μ†Œ:

  • ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ΄μš©ν•˜μ—¬ 쑰인을 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ—, 각 ν…Œμ΄λΈ”μ—μ„œ 색인을 μŠ€μΊ”ν•˜λŠ” λΉ„μš©μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 쑰인 μ»¬λŸΌμ— λŒ€ν•œ 인덱슀λ₯Ό 생성할 ν•„μš” 없이 전체 ν…Œμ΄λΈ”μ„ μŠ€μΊ”ν•˜μ—¬ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜λ―€λ‘œ, 인덱슀 생성에 λ”°λ₯Έ μ˜€λ²„ν—€λ“œκ°€ μ—†μŠ΅λ‹ˆλ‹€.

4. 병렬 처리 κ°€λŠ₯:

  • ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜λŠ” λ‹¨κ³„λŠ” 병렬 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—, λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ΄ 병렬 처리λ₯Ό μ§€μ›ν•œλ‹€λ©΄ λΉ λ₯Έ 처리 속도λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λŒ€μš©λŸ‰μ˜ ν…Œμ΄λΈ”μ„ 쑰인할 λ•Œμ—λ„ λ‹€μˆ˜μ˜ ν”„λ‘œμ„Έμ„œλ₯Ό ν™œμš©ν•˜μ—¬ 쑰인 μž‘μ—…μ„ λΆ„μ‚° μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. 데이터 μ›¨μ–΄ν•˜μš°μŠ€μ™€ OLAP μ‹œμŠ€ν…œμ— 적합:

  • 데이터 μ›¨μ–΄ν•˜μš°μŠ€λ‚˜ OLAP μ‹œμŠ€ν…œμ—μ„œλŠ” λŒ€μš©λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 큰 ν…Œμ΄λΈ”μ„ 쑰인할 λ•Œ νš¨μœ¨μ μ΄λ―€λ‘œ, 데이터 μ›¨μ–΄ν•˜μš°μŠ€λ‚˜ OLAP μ‹œμŠ€ν…œμ—μ„œ 효과적으둜 μ‚¬μš©λ©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 μ„±λŠ₯κ³Ό λ©”λͺ¨λ¦¬ νš¨μœ¨μ„ λ™μ‹œμ— κ³ λ €ν•˜μ—¬ λŒ€μš©λŸ‰μ˜ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜λŠ” μž‘μ—…μ— 효과적인 μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ©”λͺ¨λ¦¬ μ œμ•½μ΄ μžˆλŠ” ν™˜κ²½μ΄λ‚˜ μž‘μ€ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜λŠ” κ²½μš°μ—λŠ” λ‹€λ₯Έ 쑰인 μ•Œκ³ λ¦¬μ¦˜κ³Ό λΉ„κ΅ν–ˆμ„ λ•Œ μ„±λŠ₯이 λ–¨μ–΄μ§ˆ μˆ˜λ„ μžˆμœΌλ―€λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ˜ νŠΉμ„±κ³Ό 쑰인할 ν…Œμ΄λΈ”μ˜ 크기λ₯Ό κ³ λ €ν•˜μ—¬ 선택해야 ν•©λ‹ˆλ‹€.

4. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 단점

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λ‹€μŒκ³Ό 같은 단점을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

1. λ©”λͺ¨λ¦¬ μš”κ΅¬λŸ‰:

  • λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•©λ‹ˆλ‹€.
  • 큰 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜λŠ” 경우, ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ €μž₯ν•˜κΈ° μœ„ν•΄ 큰 λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•©λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ μ œμ•½μ΄ μžˆλŠ” ν™˜κ²½μ—μ„œλŠ” λ©”λͺ¨λ¦¬ μš”κ΅¬λŸ‰μœΌλ‘œ 인해 쑰인 μž‘μ—…μ΄ μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

2. 쑰인 컬럼의 쀑볡성:

  • λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 쑰인 μ»¬λŸΌμ— λŒ€ν•œ ν•΄μ‹œ 값을 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ‘°μΈν•©λ‹ˆλ‹€.
  • λ§Œμ•½ 쑰인 컬럼의 μ€‘λ³΅λœ 값이 λ§Žμ€ κ²½μš°μ—λŠ” ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ νŠΉμ • 버킷에 λŒ€λŸ‰μ˜ 데이터가 μ €μž₯될 수 있으며, μ΄λŠ” μ„±λŠ₯ μ €ν•˜λ₯Ό μ•ΌκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ 쑰인 μ»¬λŸΌμ— λŒ€ν•΄ 2개의 ν…Œμ΄λΈ”μ΄ 각각 1,000,000개의 행을 가지고 μžˆλ‹€κ³  κ°€μ •ν•œλ‹€λ©΄, ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 버킷에 ν‰κ· μ μœΌλ‘œ 1,000개의 행이 μ €μž₯될 κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 쑰인 컬럼의 μ€‘λ³΅λœ 값이 λ§Žλ‹€λ©΄ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ νŠΉμ • λ²„ν‚·μ—λŠ” μˆ˜μ‹­λ§Œ 개 μ΄μƒμ˜ 행이 μ €μž₯될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

3. ν•΄μ‹œ 좩돌:

  • ν•΄μ‹œ ν•¨μˆ˜λŠ” μž„μ˜μ˜ 데이터λ₯Ό κ³ μ • 크기의 ν•΄μ‹œ κ°’μœΌλ‘œ λ§€ν•‘ν•˜λŠ”λ°, 이 κ³Όμ •μ—μ„œ λ™μΌν•œ ν•΄μ‹œ 값을 κ°€μ§€λŠ” 데이터가 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•΄μ‹œ 좩돌이 λ°œμƒν•˜λ©΄ 두 개의 데이터가 같은 버킷에 μ €μž₯되게 되고, μ΄λŠ” μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•΄μ‹œ μΆ©λŒμ„ μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 쒋은 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ™„μ „νžˆ μΆ©λŒμ„ 방지할 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

4. 버킷 크기:

  • λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ 생성할 λ•Œ, 버킷 개수λ₯Ό κ²°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ²„ν‚·μ˜ κ°œμˆ˜κ°€ μž‘μœΌλ©΄ ν•΄μ‹œ 좩돌이 더 자주 λ°œμƒν•˜μ—¬ μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ°˜λŒ€λ‘œ λ²„ν‚·μ˜ κ°œμˆ˜κ°€ 많으면 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•˜μ—¬ λ©”λͺ¨λ¦¬ μš”κ΅¬λŸ‰μ΄ 더 λ§Žμ•„μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ μ ˆν•œ 버킷 크기λ₯Ό μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•˜λ©°, 버킷 크기에 따라 μ„±λŠ₯이 크게 λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λ©”λͺ¨λ¦¬ μš”κ΅¬λŸ‰κ³Ό 쑰인 컬럼의 쀑볡성, ν•΄μ‹œ 좩돌, 버킷 크기 λ“±μ˜ 단점을 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 단점듀을 κ³ λ €ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ˜ νŠΉμ„±κ³Ό 쑰인할 ν…Œμ΄λΈ”μ˜ 크기에 λ§žλŠ” 쑰인 μ•Œκ³ λ¦¬μ¦˜μ„ 선택해야 ν•©λ‹ˆλ‹€.

5. λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 μ‚¬μš© 사둀 및 μ˜ˆμ‹œ

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λŒ€μš©λŸ‰μ˜ ν…Œμ΄λΈ”μ„ 쑰인해야 ν•˜λŠ” κ²½μš°μ— 효과적으둜 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 데이터 μ›¨μ–΄ν•˜μš°μŠ€λ‚˜ OLAP(Online Analytical Processing) μ‹œμŠ€ν…œμ—μ„œμ˜ μ‚¬μš© 사둀가 λ§ŽμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN의 μ‚¬μš© 사둀 및 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

1. 데이터 μ›¨μ–΄ν•˜μš°μŠ€:

  • 데이터 μ›¨μ–΄ν•˜μš°μŠ€λŠ” λŒ€λŸ‰μ˜ 데이터λ₯Ό μ €μž₯ν•˜κ³  λΆ„μ„ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.
  • λ™μΌν•œ 데이터 μ›¨μ–΄ν•˜μš°μŠ€μ—μ„œ λ‹€μ–‘ν•œ 차원을 가진 ν…Œμ΄λΈ”μ„ 쑰인할 λ•Œ HASH JOIN을 μ‚¬μš©ν•˜λ©΄ λΉ λ₯Έ μ„±λŠ₯을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, μ£Όλ¬Έ 정보, 고객 정보, μƒν’ˆ 정보 λ“±μ˜ 차원 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜μ—¬ λΆ„μ„ν•˜λŠ” κ²½μš°μ— λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. OLAP μ‹œμŠ€ν…œ:

  • OLAP μ‹œμŠ€ν…œμ€ λŒ€ν™”μ‹μœΌλ‘œ 데이터λ₯Ό λΆ„μ„ν•˜κ³  μ˜μ‚¬ 결정을 μ§€μ›ν•˜λŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.
  • 닀차원 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ‹€μ–‘ν•œ 차원듀을 μ‘°μΈν•˜μ—¬ λ‹€μ–‘ν•œ μˆ˜μ€€μ˜ 집계λ₯Ό μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ— λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, μ‹œκ°„, 지역, μ œν’ˆ μΉ΄ν…Œκ³ λ¦¬ λ“±μ˜ 차원을 가진 ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜μ—¬ 집계 연산을 μˆ˜ν–‰ν•˜λŠ” OLAP μ‹œμŠ€ν…œμ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 맀우 μœ μš©ν•©λ‹ˆλ‹€.

3. λŒ€μš©λŸ‰ ν…Œμ΄λΈ” 쑰인:

  • λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 λŒ€μš©λŸ‰μ˜ ν…Œμ΄λΈ”μ„ μ‘°μΈν•˜λŠ”λ° νš¨κ³Όμ μž…λ‹ˆλ‹€.
  • μ‘°μΈν•˜λŠ” ν…Œμ΄λΈ” μ€‘μ—μ„œ 크기가 μž‘μ€ ν…Œμ΄λΈ”μ„ ν•΄μ‹œ ν…Œμ΄λΈ”λ‘œ λ§Œλ“€κ³ , 크기가 큰 ν…Œμ΄λΈ”μ„ μŠ€μΊ”ν•˜μ—¬ ν•΄μ‹œ ν…Œμ΄λΈ”κ³Ό μ‘°μΈν•˜λŠ” λ°©μ‹μœΌλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 쑰인을 μˆ˜ν–‰ν•˜λ©΄ λ””μŠ€ν¬ I/O λΉ„μš©μ„ 쀄일 수 있고, λΉ λ₯Έ μ„±λŠ₯을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ HASH JOIN은 데이터 μ›¨μ–΄ν•˜μš°μŠ€, OLAP μ‹œμŠ€ν…œ, λŒ€μš©λŸ‰ ν…Œμ΄λΈ” 쑰인 λ“± λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ 효과적으둜 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ˜ νŠΉμ„±κ³Ό 쑰인할 ν…Œμ΄λΈ”μ˜ 크기에 λ§žλŠ” 쑰인 μ•Œκ³ λ¦¬μ¦˜μ„ 선택해야 ν•©λ‹ˆλ‹€.

λŒ“κΈ€