• Mindscape ๐Ÿ”ฅ
    • Playlist ๐ŸŽง
  • Algorithm

    • 1018๋ฒˆ: ์ฒด์ŠคํŒ ๋‹ค์‹œ ์น ํ•˜๊ธฐ
    • 1966๋ฒˆ: ํ”„๋ฆฐํ„ฐ ํ
    • Python ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํŒ
    • C++ std::vector ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ
    • Vim ์‚ฌ์šฉ ๋งค๋‰ด์–ผ
  • Ubuntu

    • ๋ฆฌ๋ˆ…์Šค ์šฐ๋ถ„ํˆฌ GRUB ํฐํŠธ ๋ณ€๊ฒฝ
    • ์šฐ๋ถ„ํˆฌ ์ด๋ฏธ์ง€ ๋น„๋””์˜ค ์ธ๋„ค์ผ(๋ฏธ๋ฆฌ๋ณด๊ธฐ) ์•ˆ ๋ณด์ž„ ๋ฌธ์ œ ํ•ด๊ฒฐ
    • Wine ํ™˜๊ฒฝ์—์„œ ์นด์นด์˜คํ†ก ์‹คํ–‰ ์‹œ explorer.exe ๋œจ์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฒ•
    • ์šฐ๋ถ„ํˆฌ Wine ์นด์นด์˜คํ†ก ์‚ฌ์ง„ ์ด๋ฏธ์ง€ ์Šคํฌ๋ฆฐ์ƒท ๋ถ™์—ฌ๋„ฃ๊ธฐ
    • Wine ์นด์นด์˜คํ†ก ์ด๋ชจ์ง€ ๊นจ์ง ๋ฌธ์ œ ํ•ด๊ฒฐ
    • Ubuntu ์œˆ๋„์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋„๊ธฐ
  • Wellness

    • ์ฐจ์ „์žํ”ผ (Psyllium Husk)
    • ์—‘์ŠคํŠธ๋ผ ๋ฒ„์ง„ ์˜ฌ๋ฆฌ๋ธŒ์œ  (Extra Virgin Olive Oil)
    • ์ž๊ฐ€๋น„๊ฐ•์„ธ์ฒ™ (Nasal Irrigation)
    • QCY HT08 (MeloBuds Pro Plus)
    • ์ฝ˜์„œํƒ€ (Concerta)
    • ์ธ๋ฐ๋†€ (Inderal)
    • ์„คํŠธ๋ž„๋ฆฐ (Sertraline)
    • ๋ฉœ๋ผํ† ๋‹Œ (Melatonin)
    • ์น˜๊ฒฝ๋ถ€ ๋งˆ๋ชจ์ฆ
    • ๋ฐ”๋ฒจ ์Šค์ฟผํŠธ (Barbell Squat)
  • Humanities

    • Nordvik, Russia
    • North Sentinel Island
    • ๋กฑ๊ณ ๋กฑ๊ณ (Rongorongo)
    • ๋ฐ”๋กœํฌ ์Œ์•… (Baroque Music)
  • Design

    • ๊ตฌ๊ธ€์˜ ์•„์ด์ฝ˜ ๋Œ€๊ฐœํŽธ โ€” 6๋…„ ๋งŒ์˜ ์‹ค์ˆ˜ ์ธ์ •
    • ์ œ๋Ÿด๋“œ ์  ํƒ€ โ€” ๋Ÿญ์…”๋ฆฌ ์Šคํฌ์ธ  ์›Œ์น˜์˜ ์ฐฝ์‹œ์ž
    • ๋ฐ”์šฐํ•˜์šฐ์Šค โ€” ํ˜„๋Œ€ ๋””์ž์ธ์˜ ์›์ 
  • Brands

    • NOMOS Glashรผtte
    • Frรฉdรฉrique Constant
    • KZ (Knowledge Zenith)
    • ์—์ŠคํŠธ๋ผ (AESTURA)
    • JINHAO (้‡‘่ฑช)
    • Herman Miller
    • ๋ฐ์Šค์ปค (DESKER)
    • ๋ฌด์‹ ์‚ฌ ์Šคํƒ ๋‹ค๋“œ (Musinsa Standard)
  • Finance

    • ํ˜„๋Œ€์นด๋“œ ZERO โ€” Edition2 vs Edition3 ๋น„๊ต
    • ์‹ ํ•œ์นด๋“œ ์ฒ˜์Œ
    • S&P 500 ETF ํˆฌ์ž ๊ฐ€์ด๋“œ
    • ํŒŒํ‚นํ†ต์žฅ vs CMA ํ†ต์žฅ
    • ๋ฒ„ํฌ์…” ํ•ด์„œ์›จ์ด (Berkshire Hathaway)
    • ๋น„ํŠธ์ฝ”์ธ(Bitcoin)
  • Products

    • ์˜ค๋””์˜ค ์ธํ„ฐํŽ˜์ด์Šค (Audio Interface)
    • ์ฟ ๋ฃจํ† ๊ฐ€ (KURUTOGA)
    • CX31993 DAC ๋™๊ธ€
    • ํด๋ Œ์ง• ๋ฐ€ํฌ (Cleansing Milk)
    • ํ”ผ์ ฏ ํ† ์ด (Fidget Toy)
    • ThinkPad
  • Programming Languages

    • 8.0. Statement Level Control Structures
    • 8. Subprogram
    • 9. Implementing Subprogram
    • 10.1. Abstract Data Types and Encapsulation Constructs
    • 10.2. Support for Object Oriented Programming
    • 11. Concurrency
    • 12. FPL (1)
    • 13. FPL (2)
    • 14. Exception Handling and Event Handling
    • Final Exam

Assignment 4: Implementation of Natural Join on B+B^+B+-Tree

์ž‘์„ฑ 2026. 6. 12.ยท์ˆ˜์ • 2026. 6. 12.

2021024057 ๊น€๋ณ‘์ค€

1. Design

  • ๋ณธ ๊ณผ์ œ์˜ ๋ชฉํ‘œ๋Š” B+B^+B+-tree index ๊ตฌ์กฐ๋กœ ์ €์žฅ๋œ ๋‘ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”(Table 1, Table 2)์— ๋Œ€ํ•˜์—ฌ Natural join ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋Š” <Key, Value> pair๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, Key๋Š” 8-byte์˜ ์ •์ˆ˜(int64_t), Value๋Š” ์ตœ๋Œ€ 120-byte์˜ ๋ฌธ์ž์—ด์œผ๋กœ ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๋ช…์„ธ์— ๋”ฐ๋ผ Key๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” Unique key๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ join ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์  ์‚ฌ๊ณ  ๊ณผ์ •์„ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

1.1. Naive Approach: Nested loop join

  • ๊ฐ€์žฅ ์ง๊ด€์ ์ธ(naiveํ•œ) ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋– ์˜ฌ๋ ค๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ๋™์ž‘: Table 1(Outer relation)์˜ ๋ชจ๋“  tuple์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์Šค์บ”ํ•˜๋ฉด์„œ, ๊ฐ tuple์˜ key๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ Table 2(Inner relation)์˜ ๋ชจ๋“  tuple์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์Šค์บ”ํ•˜์—ฌ ๋งค์นญ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ถ„์„: ์ด ๋ฐฉ์‹์€ ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜๊ฐ€ ๊ฐ๊ฐ N,MN, MN,M์ผ ๋•Œ, O(Nร—M)O(N \times M)O(Nร—M)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ €ํ•˜๋  ๊ฒƒ์ด๋ฏ€๋กœ, ํ•ด๋‹น ๊ณผ์ œ์™€ ๊ฐ™์ด ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1.2. Sort-Merge Join?

  • Join์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ idea๋Š” ๋‘ ํ…Œ์ด๋ธ”์„ key๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ sortํ•œ ํ›„ mergeํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ๋™์ž‘: Quick sort์™€ ๊ฐ™์ด (๊ธฐ์กด์— ํšจ์œจ์ ์ด๋ผ๊ณ ) ์•Œ๋ ค์ ธ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์— ๋ถˆ๋Ÿฌ์˜จ ๋‘ ํ…Œ์ด๋ธ”๋“ค์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ ฌ๋œ ๋‘ ํ…Œ์ด๋ธ”์— ๊ฐ๊ฐ ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ณ , key๊ฐ’์„ ๋น„๊ตํ•˜๋ฉฐ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•œ ๋ฒˆ์˜ ์Šค์บ”๋งŒ์œผ๋กœ join์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” idea์ž…๋‹ˆ๋‹ค.
    • ๋ถ„์„: ์ •๋ ฌ ๊ณผ์ •์— O(NlogโกN+MlogโกM)O(N \log N + M \log M)O(NlogN+MlogM)์ด ์†Œ์š”๋˜๋ฉฐ, ์ดํ›„ ๋ณ‘ํ•ฉ ๊ณผ์ •์€ O(N+M)O(N + M)O(N+M)์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณธ ๊ณผ์ œ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 4 MiB๋กœ ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, External merge sort ๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ตฌํ˜„ ๋ณต์žก๋„์™€ ๋””์Šคํฌ I/O์˜ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1.3. Final Design: B+B^+B+-Tree Based Merge Join

  • ๋ณธ ๊ณผ์ œ์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ ์ด๋ฏธ B+B^+B+-tree ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • B+B^+B+-tree์˜ leaf node๋“ค์€ Key ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, linked list ํ˜•ํƒœ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ„๋„์˜ ์ถ”๊ฐ€์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋„์ž…ํ•˜์ง€ ์•Š์•„๋„ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ sorted state๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ตœ์ข…์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ตœ์ ํ™”๋œ ์„ค๊ณ„๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  1. ๊ฐ B+B^+B+-tree์˜ ๊ฐ€์žฅ leftmost์— ํ•ด๋‹นํ•˜๋Š” leaf page๋ถ€ํ„ฐ ์ ‘๊ทผ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‘ ํ…Œ์ด๋ธ”์˜ ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค์„œ(Cursor)๋ฅผ ๋„์ž…ํ•˜์—ฌ ์œ ์ง€ํ•˜๋ฉด์„œ, ๋‘ key๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ์„œ๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
    • Key1 == Key2์ธ ๊ฒฝ์šฐ: ๋‘ Key๊ฐ€ ์ผ์น˜ํ•˜๋ฏ€๋กœ join ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๋‘ ์ปค์„œ๋ฅผ ๋ชจ๋‘ ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • Key1 < Key2์ธ ๊ฒฝ์šฐ: Table 1์˜ Key๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ, Table 1์˜ ์ปค์„œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋” ํฐ Key๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
    • Key1 > Key2์ธ ๊ฒฝ์šฐ: Table 2์˜ Key๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ, Table 2์˜ ์ปค์„œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. Page Traversal: ํ˜„์žฌ leaf page์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด, Right Sibling Page Number๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋‹ค์Œ leaf page๋ฅผ ๋””์Šคํฌ์—์„œ loadํ•ฉ๋‹ˆ๋‹ค.

1.3.1. ๊ฒฐ๋ก 

  • ์ด ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ๋ณ„๋„์˜ ์ •๋ ฌ ๋น„์šฉ ์—†์ด O(N+M)O(N + M)O(N+M)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ํšจ์œจ์ ์ธ natural join์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ํ•œ ๋ฒˆ์— ํ•„์š”ํ•œ leaf page๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ 4 MiB ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ๋ถ„ํžˆ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Implement

  • ์•ž์—์„œ ์„ค๊ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ์กด์˜ single ํ…Œ์ด๋ธ” ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

2.1. Global Variable & Structure Extension

  • ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ๋™์‹œ์— ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋‹จ์ผ fd, hp(Header Page), rt(Root Page) ๋ณ€์ˆ˜ ์™ธ์— ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์„ ์œ„ํ•œ ๋ณ€์ˆ˜๋“ค์„ ์ถ”๊ฐ€๋กœ ์„ ์–ธํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
// Global variables for handling two tables
H_P *hp, *hp2;          // Header pages
page *rt = NULL, *rt2 = NULL; // Root pages
int fd = -1, fd2 = -1;  // File descriptors

2.2. Modification of open_table

  • ๊ธฐ์กด์˜ open_table ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋งŒ ์ž…๋ ฅ๋ฐ›์•˜์œผ๋‚˜, join ์—ฐ์‚ฐ์„ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐœ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.. ์ด๋ฅผ ์œ„ํ•ด ๊ธฐ์กด logic์„ open_single_table์ด๋ผ๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ƒˆ๋กœ์šด open_table ํ•จ์ˆ˜๋Š” ์ด๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” wrapper์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์žฌ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • open_single_table: ๋‹จ์ผ DB ํŒŒ์ผ์„ ์—ด๊ณ  fd, header, root ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • open_table: ๋‘ ๊ฐœ์˜ ๊ฒฝ๋กœ(pathname1, pathname2)๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ฐ๊ฐ open_single_table์„ ํ˜ธ์ถœํ•˜๊ณ , ๋‘ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ํ•ฉ์‚ฐํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค.
int open_table(char * pathname1, char * pathname2) {
    int ret1 = open_single_table(pathname1, &fd, &hp, &rt);
    int ret2 = open_single_table(pathname2, &fd2, &hp2, &rt2);

    return ret1 + ret2;
}

2.3. Analysis of Existing API Modification

  • ์ด์ œ, ๊ธฐ์กด์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” db_find, db_insert, db_delete ํ•จ์ˆ˜๋“ค์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ฒ€ํ† ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ open_table์„ ํ†ตํ•ด ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์—ด๋”๋ผ๋„, ๊ธฐ์กด์˜ insert, delete, find ํ•จ์ˆ˜๋“ค์€ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”(fd, rt ๋“ฑ)์„ ๋Œ€์ƒ์œผ๋กœ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ด์— ๋”ฐ๋ผ์„œ table 2์— ๋Œ€ํ•œ ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํ•œ๊ณ„์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ณธ ๊ณผ์ œ์˜ ๋ช…์„ธ๋Š” ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ join ์—ฐ์‚ฐ ๊ตฌํ˜„์— ์žˆ์œผ๋ฉฐ, ๋‹ค์ค‘ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋™์‹œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋‚˜ ๊ด€๋ฆฌ๋Š” ๊ณผ์ œ์˜ ๋ฒ”์œ„์™€ ๋ฌด๊ด€ํ•œ ๋‚ด์šฉ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • Join ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ read-only ๋ฐฉ์‹์œผ๋กœ๋งŒ index ๊ตฌ์กฐ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ ๊ธฐ์กด ํ•จ์ˆ˜๋“ค์˜ ์ˆ˜์ • ์—†์ด๋„ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2.4. Implementation of db_join

  • ํ•ต์‹ฌ logic์— ํ•ด๋‹นํ•˜๋Š” db_join ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  1. ๋‘ ํ…Œ์ด๋ธ” ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ(rpo == 0), join ๊ฒฐ๊ณผ๋Š” ๊ณต์ง‘ํ•ฉ์ผ ๊ฒƒ์ด๋ฏ€๋กœ ์ฆ‰์‹œ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ถ”๊ฐ€์ ์ธ ์—ฐ์‚ฐ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. (์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ์กฐ์น˜)
    void db_join() {
        // ๊ฐ ํ…Œ์ด๋ธ”์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
        if (hp->rpo == 0 || hp2->rpo == 0) {
            return; // ๋ฐ”๋กœ ์ข…๋ฃŒ
        }
    
  2. Initialization: find_leaf logic์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ B+B^+B+-tree์˜ ๊ฐ€์žฅ ์™ผ์ชฝ leaf page๋ฅผ ์ฐพ์•„ ๋ฉ”๋ชจ๋ฆฌ์— loadํ•ฉ๋‹ˆ๋‹ค.
  3. Merge loop: ๋‘ leaf page์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆœํšŒํ•˜๋Š” while ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋‘ ๋ ˆ์ฝ”๋“œ์˜ Key(key1, key2)๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
    • Match (key1 == key2): printf๋ฅผ ํ†ตํ•ด key, value1, value2 ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. Key๋Š” Unique ํ•˜๋ฏ€๋กœ ๋‘ ์ธ๋ฑ์Šค(idx1, idx2)๋ฅผ ๋ชจ๋‘ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
    • Compare (key1 < key2): Table 1์˜ ํ˜„์žฌ Key๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ, idx1์„ ์ฆ๊ฐ€์‹œ์ผœ Table 1์—์„œ ๋” ํฐ Key๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
    • Compare (key1 > key2): Table 2์˜ ํ˜„์žฌ Key๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ, idx2๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
        // ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” key๊ฐ’ ๊ฐ๊ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
        int64_t key1 = p1->records[idx1].key;
        int64_t key2 = p2->records[idx2].key;
    
        // Key ๋น„๊ต ๋ฐ join
        if (key1 == key2) {
            // ์ถœ๋ ฅ ํ˜•์‹์— ๋”ฐ๋ผ์„œ  ์ถœ๋ ฅ
            printf("%lld,%s,%s\n", key1, p1->records[idx1].value, p2->records[idx2].value);
            
            // Unique Key์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‘˜ ๋‹ค ๋‹ค์Œ์œผ๋กœ ์ด๋™
            idx1++;
            idx2++;
        }
        else if (key1 < key2) {
            // Table 1์˜ ํ‚ค๊ฐ€ ์ž‘์œผ๋ฉด Table 1์˜ ํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€
            idx1++;
        }
        else {
            // Table 2์˜ ํ‚ค๊ฐ€ ์ž‘์œผ๋ฉด Table 2 ํฌ์ธํ„ฐ ์ฆ๊ฐ€
            idx2++;
        }
    
  4. Page Transition: ์ธ๋ฑ์Šค๊ฐ€ ํ˜„์žฌ Page์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด, ํ•ด๋‹น Page์˜ right_sibling์˜ offset์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • right_sibling์ด 0์ด ์•„๋‹ˆ๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ load_page ํ•จ์ˆ˜๋กœ ์ฝ์–ด์˜ค๊ณ  ์ธ๋ฑ์Šค๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • right_sibling์ด 0์ด๋ฉด(๋งˆ์ง€๋ง‰ Page), ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  5. Memory Release: ์‚ฌ์šฉ์ด ๋๋‚œ Page ๋ฉ”๋ชจ๋ฆฌ๋ฅผ freeํ•˜์—ฌ ์ž์› ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
        if (p1 != NULL) free(p1);
        if (p2 != NULL) free(p2);
    
  • ์ด ๊ตฌํ˜„์€ ๋””์Šคํฌ I/O๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ page๋ฅผ ๋กœ๋”ฉํ•˜๋Š” on-demand ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

3. Result

  • ๊ตฌํ˜„๋œ join ๊ธฐ๋Šฅ์˜ ์ •ํ™•์„ฑ ๋ฐ ์„ฑ๋Šฅ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

3.1. Test Environment Setup

  • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•œ ๊ฒ€์ฆ์„ ์œ„ํ•ด python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • Data Generation: -10000๋ถ€ํ„ฐ 10000๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š” Key์™€ ๋žœ๋คํ•œ String Value๋ฅผ ํฌํ•จํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ ํŒŒ์ผ(input1.txt, input2.txt)์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํŒŒ์ผ์€ ์ผ๋ถ€ Key๊ฐ€ ๊ฒน์น˜๋„๋ก ์„ค์ •ํ•˜์—ฌ join ๊ฒฐ๊ณผ๊ฐ€ ๋ช…ํ™•ํžˆ ๋‚˜ํƒ€๋‚˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

3.2. Execution Procedure

  • ํ˜„์žฌ db_insert ๊ธฐ๋Šฅ์€ ๋‹จ์ผ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ(์ถ”๊ฐ€์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ), ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์†Œ ์šฐํšŒ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋‘ ๊ฐœ์˜ DB ํŒŒ์ผ์„ ๊ตฌ์ถ•ํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    1. input1.txt๋ฅผ ์ด์šฉํ•˜์—ฌ test1.db์— ๋ฐ์ดํ„ฐ๋ฅผ insertํ•œ๋‹ค.
    2. ์ƒ์„ฑ๋œ test1.db์˜ ํŒŒ์ผ๋ช…์„ test2.db๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
    3. ํ”„๋กœ๊ทธ๋žจ์„ ์žฌ์‹คํ–‰ํ•˜์—ฌ ๋นˆ test1.db๋ฅผ ์ƒ์„ฑํ•˜๊ณ , input2.txt๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
    4. ๊ฒฐ๊ณผ์ ์œผ๋กœ test1.db์™€ test2.db ๋‘ ๊ฐœ์˜ ์™„์„ฑ๋œ B+B^+B+-tree ํŒŒ์ผ์„ ํ™•๋ณดํ•˜์˜€๋‹ค.

3.3. Verification

  • ๊ตฌ์ถ•๋œ ๋‘ DB์— ๋Œ€ํ•ด j (Join) ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, key๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ํŠœํ”Œ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์ •ํ™•ํ•˜๊ฒŒ Key, Value1, Value2 ํ˜•์‹์ด ์ถœ๋ ฅ๋จ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • O(N+M)O(N+M)O(N+M) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋˜์–ด, ์•ฝ 1๋งŒ ๊ฑด ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋„ ํฐ ์ง€์—ฐ ์—†์ด(๋Œ€๋žต 0.1์ดˆ ์ด๋‚ด์—) ์ฆ‰๊ฐ์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ๋„์ถœ๋จ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

4. Troubleshooting

  • ๊ตฌํ˜„ ๊ณผ์ •์—์„œ ์ค‘๋Œ€ํ•œ ์–ด๋ ค์›€์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ test ๊ณผ์ •์—์„œ ์•ฝ๊ฐ„์˜ ์ฐฉ์˜ค๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„์„ ๊ธฐ์ˆ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

4.1. Issue: Misinterpretation of Memory Usage

4.1.1. ๋ฌธ์ œ ์ƒํ™ฉ

...
996,variable,ethernet
997,quince,key
999,node,quince
Join execution time: 0.000866 sec
Memory usage: 1277952 KB
Warning: Memory Limit Exceeded! (Limit: 4096 KB)
  • ๊ณผ์ œ์˜ ํ•ต์‹ฌ ์ œ์•ฝ์‚ฌํ•ญ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ 4 MiB ์ดํ•˜๋ฅผ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ํ™˜๊ฒฝ(macOS)์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋„์ค‘ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํฐ ์ˆ˜์น˜๋กœ ํ™•์ธ๋˜์–ด, ๋ฉ”๋ชจ๋ฆฌ leak์ด ๋ฐœ์ƒํ–ˆ๊ฑฐ๋‚˜ page ๊ด€๋ฆฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จ(์˜คํ•ด)ํ•˜์—ฌ ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

4.1.2. ํ•ด๊ฒฐ ๊ณผ์ •

  1. valgrind๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” macOS ํ™˜๊ฒฝ์ด๋ผ ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ์™€ ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ์›์ธ์„ ๋ถ„์„ํ•˜๋˜ ๋„์ค‘ macOS์˜ ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋‹จ์œ„๋ฅผ KB๊ฐ€ ์•„๋‹Œ Bytes ๋‹จ์œ„๋กœ, ํ˜น์€ Page ๋‹จ์œ„๋กœ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  3. ๋‹จ์œ„๋ฅผ ๋ณด์ •ํ•˜์—ฌ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด๋ณธ ๊ฒฐ๊ณผ, ์‹ค์ œ ์‚ฌ์šฉ๋Ÿ‰์€ ํ—ˆ์šฉ ๋ฒ”์œ„์ธ 4 MiB ์ด๋‚ด์ž„์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  4. ๋˜ํ•œ, db_join ํ•จ์ˆ˜ ๋‚ด์—์„œ malloc์œผ๋กœ ํ• ๋‹นํ•œ page ๊ตฌ์กฐ์ฒด๋“ค์ด loop ์ข…๋ฃŒ ํ›„ ๋˜๋Š” ํ•จ์ˆ˜ return ์ „์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ free ๋˜๋Š”์ง€ ์ฝ”๋“œ๋ฅผ ์žฌ๊ฒ€ํ† ํ•˜์—ฌ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.

4.1.3. ๊ฒฐ๋ก 

  • ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์น˜ ํ•ด์„์˜ ์˜ค๋ฅ˜์˜€์œผ๋ฉฐ, ์‹ค์ œ ๊ตฌํ˜„๋œ B+B^+B+-tree ๊ธฐ๋ฐ˜์˜ join ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋งŒ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ๋ถ„ํžˆ ๋งŒ์กฑํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ตœ๊ทผ ์ˆ˜์ •: 26. 6. 12. ์˜คํ›„ 3:28
Contributors: kmbzn, Claude Sonnet 4.6

BUILT WITH

CloudflareNode.jsGitHubGitVue.jsJavaScriptVSCodenpm

All trademarks and logos are property of their respective owners.
ยฉ 2026 kmbzn ยท MIT License