Assignment 4: Implementation of Natural Join on -Tree
2021024057 ๊น๋ณ์ค
1. Design
- ๋ณธ ๊ณผ์ ์ ๋ชฉํ๋ -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์ ์ฒ์๋ถํฐ ๋๊น์ง ์ค์บํ์ฌ ๋งค์นญ๋๋์ง ํ์ธํฉ๋๋ค.
- ๋ถ์: ์ด ๋ฐฉ์์ ๋ ํ ์ด๋ธ์ ๋ ์ฝ๋ ์๊ฐ ๊ฐ๊ฐ ์ผ ๋, ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ต๋๋ค. ์ด์ ๋ฐ๋ผ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ์ฑ๋ฅ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ ํ๋ ๊ฒ์ด๋ฏ๋ก, ํด๋น ๊ณผ์ ์ ๊ฐ์ด ๋์ฉ๋ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ ์ ์๋ ์์คํ ์์๋ ์ ํฉํ์ง ์์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋จํ์์ต๋๋ค.
1.2. Sort-Merge Join?
- Join์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ ๋ค๋ฅธ idea๋ ๋ ํ
์ด๋ธ์ key๊ฐ์ ๊ธฐ์ค์ผ๋ก sortํ ํ mergeํ๋ ๊ฒ์
๋๋ค.
- ๋์: Quick sort์ ๊ฐ์ด (๊ธฐ์กด์ ํจ์จ์ ์ด๋ผ๊ณ ) ์๋ ค์ ธ ์๋ ์๊ณ ๋ฆฌ์ฆ๋ค์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ถ๋ฌ์จ ๋ ํ ์ด๋ธ๋ค์ ์ ๋ ฌํฉ๋๋ค. ์ ๋ ฌ๋ ๋ ํ ์ด๋ธ์ ๊ฐ๊ฐ ํฌ์ธํฐ๋ฅผ ๋๊ณ , key๊ฐ์ ๋น๊ตํ๋ฉฐ ํฌ์ธํฐ๋ฅผ ์ด๋์ํค๋ ๋ฐฉ์์ผ๋ก ํ ๋ฒ์ ์ค์บ๋ง์ผ๋ก join์ ์๋ฃํ ์ ์๋ idea์ ๋๋ค.
- ๋ถ์: ์ ๋ ฌ ๊ณผ์ ์ ์ด ์์๋๋ฉฐ, ์ดํ ๋ณํฉ ๊ณผ์ ์ ์ด ์์๋ฉ๋๋ค. ํ์ง๋ง ๋ณธ ๊ณผ์ ์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด
4 MiB๋ก ์ ํ๋์ด ์์ต๋๋ค. ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ์ฌ ์ ๋ ฌํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ, External merge sort ๋ฑ์ ๊ณ ๋ คํด์ผ ํ๋ฏ๋ก ๊ตฌํ ๋ณต์ก๋์ ๋์คํฌ I/O์ ๋น์ฉ์ด ์ฆ๊ฐํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
1.3. Final Design: -Tree Based Merge Join
- ๋ณธ ๊ณผ์ ์ ๋ฐ์ดํฐ ํ์ผ์ ์ด๋ฏธ -tree ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ๋๊ณ ์๋ค๋ ์ ์ ๊ณ ๋ คํ์์ต๋๋ค.
- -tree์ leaf node๋ค์ Key ์์๋๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฉฐ, linked list ํํ๋ก ์๋ก ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ์ด๋ ๋ณ๋์ ์ถ๊ฐ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ํ์ง ์์๋ ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ sorted state๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๋ฐ๋ผ์ ์ต์ข ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ต์ ํ๋ ์ค๊ณ๋ฅผ ๋์ถํ ์ ์์์ต๋๋ค.
- ๊ฐ -tree์ ๊ฐ์ฅ leftmost์ ํด๋นํ๋ leaf page๋ถํฐ ์ ๊ทผ์ ์์ํฉ๋๋ค.
- ๋ ํ
์ด๋ธ์ ํ์ฌ ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ปค์(Cursor)๋ฅผ ๋์
ํ์ฌ ์ ์งํ๋ฉด์, ๋ key๊ฐ์ ํฌ๊ธฐ๋ฅผ ์๋ก ๋น๊ตํฉ๋๋ค.
Key1 == Key2์ธ ๊ฒฝ์ฐ: ๋ Key๊ฐ ์ผ์นํ๋ฏ๋ก join ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ณ , ๋ ์ปค์๋ฅผ ๋ชจ๋ ๋ค์ ๋ ์ฝ๋๋ก ์ด๋ํฉ๋๋ค.Key1 < Key2์ธ ๊ฒฝ์ฐ: Table 1์ Key๊ฐ ์์ผ๋ฏ๋ก, Table 1์ ์ปค์๋ฅผ ๋ค์์ผ๋ก ์ด๋ํ์ฌ ๋ ํฐ Key๋ฅผ ํ์ํฉ๋๋ค.Key1 > Key2์ธ ๊ฒฝ์ฐ: Table 2์ Key๊ฐ ์์ผ๋ฏ๋ก, Table 2์ ์ปค์๋ฅผ ๋ค์์ผ๋ก ์ด๋ํฉ๋๋ค.
- Page Traversal: ํ์ฌ leaf page์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ํ์ํ๋ฉด,
Right Sibling Page Number๋ฅผ ์ฐธ์กฐํ์ฌ ๋ค์ leaf page๋ฅผ ๋์คํฌ์์ loadํฉ๋๋ค.
1.3.1. ๊ฒฐ๋ก
- ์ด ์ค๊ณ๋ฅผ ํตํด ๋ณ๋์ ์ ๋ ฌ ๋น์ฉ ์์ด ์ ์๊ฐ๋ณต์ก๋๋ก ํจ์จ์ ์ธ 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ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค.
- ๋ ํ
์ด๋ธ ์ค ํ๋๋ผ๋ ๋น์ด์๋ ๊ฒฝ์ฐ(
rpo == 0), join ๊ฒฐ๊ณผ๋ ๊ณต์งํฉ์ผ ๊ฒ์ด๋ฏ๋ก ์ฆ์ ํจ์๋ฅผ ์ข ๋ฃํ์ฌ ๋ถํ์ํ ์ถ๊ฐ์ ์ธ ์ฐ์ฐ์ ๋ฐฉ์งํฉ๋๋ค. (์ฑ๋ฅ ํฅ์์ ์ํ ์กฐ์น)void db_join() { // ๊ฐ ํ ์ด๋ธ์ด ๋น์ด์๋์ง ํ์ธ if (hp->rpo == 0 || hp2->rpo == 0) { return; // ๋ฐ๋ก ์ข ๋ฃ } - Initialization:
find_leaflogic์ ํ์ฉํ์ฌ ๊ฐ -tree์ ๊ฐ์ฅ ์ผ์ชฝ leaf page๋ฅผ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ์ loadํฉ๋๋ค. - 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++; } - ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ ๋ ์ฝ๋์ Key(
- Page Transition: ์ธ๋ฑ์ค๊ฐ ํ์ฌ Page์ ๋ ์ฝ๋ ์๋ฅผ ์ด๊ณผํ๋ฉด, ํด๋น Page์
right_sibling์ offset์ ํ์ธํฉ๋๋ค.right_sibling์ด 0์ด ์๋๋ฉด ํด๋น ํ์ด์ง๋ฅผload_pageํจ์๋ก ์ฝ์ด์ค๊ณ ์ธ๋ฑ์ค๋ฅผ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.right_sibling์ด 0์ด๋ฉด(๋ง์ง๋ง Page), ํ์์ ์ข ๋ฃํฉ๋๋ค.
- 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 ๊ฒฐ๊ณผ๊ฐ ๋ช ํํ ๋ํ๋๋๋ก ํ์ต๋๋ค.
- Data Generation:

3.2. Execution Procedure
ํ์ฌ
db_insert๊ธฐ๋ฅ์ ๋จ์ผ ํ์ผ์ ๋ํด์๋ง ์ฝ์ ์ด ๊ฐ๋ฅํ ์ํ์ด๋ฏ๋ก(์ถ๊ฐ์ ์ผ๋ก ๋ณ๊ฒฝํ์ง ์์์ผ๋ฏ๋ก), ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์ฐํ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ๊ฐ์ DB ํ์ผ์ ๊ตฌ์ถํ๋๋ก ํ์์ต๋๋ค.input1.txt๋ฅผ ์ด์ฉํ์ฌtest1.db์ ๋ฐ์ดํฐ๋ฅผ insertํ๋ค.- ์์ฑ๋
test1.db์ ํ์ผ๋ช ์test2.db๋ก ๋ณ๊ฒฝํ๋ค. - ํ๋ก๊ทธ๋จ์ ์ฌ์คํํ์ฌ ๋น
test1.db๋ฅผ ์์ฑํ๊ณ ,input2.txt๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก
test1.db์test2.db๋ ๊ฐ์ ์์ฑ๋ -tree ํ์ผ์ ํ๋ณดํ์๋ค.
3.3. Verification
- ๊ตฌ์ถ๋ ๋ DB์ ๋ํด
j(Join) ๋ช ๋ น์ด๋ฅผ ์ํํ๋๋ก ํฉ๋๋ค. - ํฐ๋ฏธ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ, key๊ฐ์ด ์ผ์นํ๋ ํํ๋ค์ ๋ํด์๋ง ์ ํํ๊ฒ
Key, Value1, Value2ํ์์ด ์ถ๋ ฅ๋จ์ ํ์ธํ์์ต๋๋ค. - ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋์ด, ์ฝ 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. ํด๊ฒฐ ๊ณผ์
valgrind๋ฅผ ์ฌ์ฉํ ์ ์๋ macOS ํ๊ฒฝ์ด๋ผ ์์คํ ๋ชจ๋ํฐ์ ํฐ๋ฏธ๋ ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ธํ์ต๋๋ค.- ์์ธ์ ๋ถ์ํ๋ ๋์ค macOS์ ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋จ์๋ฅผ
KB๊ฐ ์๋Bytes๋จ์๋ก, ํน์ Page ๋จ์๋ก ๋ค๋ฅด๊ฒ ํ์ํ ์ ์๋ค๋ ์ ์ ์ดํดํ์์ต๋๋ค. - ๋จ์๋ฅผ ๋ณด์ ํ์ฌ ๋ค์ ๊ณ์ฐํด๋ณธ ๊ฒฐ๊ณผ, ์ค์ ์ฌ์ฉ๋์ ํ์ฉ ๋ฒ์์ธ
4 MiB์ด๋ด์์ ํ์ธํ์์ต๋๋ค. - ๋ํ,
db_joinํจ์ ๋ด์์malloc์ผ๋ก ํ ๋นํpage๊ตฌ์กฐ์ฒด๋ค์ด loop ์ข ๋ฃ ํ ๋๋ ํจ์ return ์ ์ ์ฌ๋ฐ๋ฅด๊ฒfree๋๋์ง ์ฝ๋๋ฅผ ์ฌ๊ฒํ ํ์ฌ ์์ ์ฑ์ ํ๋ณดํ์ต๋๋ค.
4.1.3. ๊ฒฐ๋ก
- ๋จ์ํ ๋ฉ๋ชจ๋ฆฌ ์์น ํด์์ ์ค๋ฅ์์ผ๋ฉฐ, ์ค์ ๊ตฌํ๋ -tree ๊ธฐ๋ฐ์ join ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ ํ์ด์ง๋ง์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๊ฒ ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ๋ถํ ๋ง์กฑํ๊ณ ์์์ ํ์ธํ์์ต๋๋ค.

