-
Notifications
You must be signed in to change notification settings - Fork 0
Project4
์ต๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ ์งํ๋ฉฐ (์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น/์ฌ์ฉ์ ํ์ง ์์ผ๋ฉฐ) JOIN operation์ ๊ตฌํ
-
int join_table(int table_id_1, int table_id_2, char* pathname)
ํจ์๋ฅผ API service๋ก ์ ๊ณต - 2๊ฐ table์ natural join
- ์ฃผ์ด์ง pathname์ ํ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
- ๊ฒฐ๊ณผ๋ key์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋์ด์์ ๊ฒ
- ๊ตฌํํ ํจ์๊ฐ ์ฑ๊ณต ๋ฐํ ์ ๊ฒฐ๊ณผ๊ฐ write ์๋ฃ๋์ด ์์ ๊ฒ
- JOIN operation์ด ์กด์ฌํ relational set operator layer๋ฅผ ์ถ๊ฐํ์์ผ๋ฉฐ, API layer์ join_table ํจ์(wrapper function)๊ฐ ํธ์ถํ rso_join_table ํจ์๋ฅผ relational set operator layer์ ๊ตฌํํ์๋ค. ํ์ layer์์ ๊ตฌํ๋ API๋ค์ wrapper function์ ํด๋น layer์ ์ถ๊ฐํ์์ผ๋ฉฐ, ํด๋น layer์์ buffer๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด index manager์ buffer manager ํจ์ ์ผ๋ถ์ wrapper function์ ์ถ๊ฐํ์๋ค. ์์ธํ ๋ด์ฉ์ Layer ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ฐธ๊ณ
- ํด๋น layer์ rso_join_table ํจ์๊ฐ ์ฌ์ฉํ๊ธฐ ์ํ find_leftmost_leaf ํจ์๋ฅผ index manager์ ์ถ๊ฐ ๊ตฌํํ์๋ค.
- ํด๋น layer์ rso_join_table ํจ์๊ฐ ์ฌ์ฉํ๊ธฐ ์ํ advance ํจ์๋ฅผ ํด๋น layer์ ๊ตฌํํ์๋ค.
- JOIN operation์ ๊ตฌํํ๊ธฐ ์ํด์๋, Block Nested Loops Join, Index Nested Loops Join, Sort-Merge Join, Hash Join ๋ฑ์ ๊ณ ๋ คํด๋ณผ ์ ์๋ค. ํ์ฌ DB๋ B+Tree๋ก ๋ชจ๋ record๊ฐ key์ ๋ฐ๋ผ ์ ๋ ฌ๋ ์ํ์ด๊ณ , ์ถ๋ ฅํ ๊ฒฐ๊ณผ๊ฐ key์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋์ด์ผ ํ๋ฏ๋ก, ์ ๋ ฌ๋ ์ ๋ ฅ ์ ์ ๋ ฌ ์์ ์ passํ ์ ์๊ณ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ Sort-Merge Join์ ์ ํํ์๋ค.
- ์ด์ ๋ฐ๋ผ, ๊ฐ์์๋ฃ(lecture11 16slide)์์ ์ ์๋ pseudo code๋ฅผ ์ฐธ๊ณ ํ์์ผ๋, ํ์ฌ DB๋ key์ ์ค๋ณต์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก ๋ณด๋ค ๋จ์ํ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
int rso_join_table(int table_id_1, int table_id_2, char* pathname);
- relational set operator layer์ ๊ตฌํ
- 2๊ฐ table์ id๋ฅผ ์ ๋ ฅ๋ฐ์์ natural join์ ์ํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฅ๋ฐ์ pathname์ ํ์ผ์ ์ ์ฅํ ํ, ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ค. (์ฑ๊ณต : 0, ์คํจ : non-zero value)
- key์ ์ค๋ณต์ ๊ฐ์ ํ ๊ธฐ์กด Sort-Merge Join๊ณผ ๋ฌ๋ฆฌ, ์ค๋ณต key block์ start point๋ฅผ ์ ์ฅํด๊ฐ๋ฉฐ ๋์๊ฐ ํ์๊ฐ ์๊ณ , ๊ฐ table์์ page๋ฅผ 1๊ฐ์ฉ readํด๊ฐ๋ฉฐ ์ํ์ด ๊ฐ๋ฅํ๋ค.
- ๊ตฌ์ฒด์ ์ธ ๊ตฌํ๊ณผ ๊ทธ ์์๋ ์๋์ ๊ฐ๋ค.
- ์ธ์๋ก ๋ฐ์ pathname์ ๊ฐ์ง๋ file์ (๋ฎ์ด)์ฐ๊ธฐ ์ ์ฉ์ผ๋ก openํ๋ค. ์คํจ ์ -1์
๋ฐํ
ํ๋ค. - ๊ฐ table์ header page๋ฅผ requestํ๊ณ , find_leftmost_leaf ํจ์๋ฅผ callํ์ฌ ๊ฐ table์ leftmost leaf page๋ฅผ ์ฐพ๋๋ค. request ์คํจ ์ -2๋ฅผ
๋ฐํ
, find_leftmost_leaf ์คํจ ์(table์ด ๋น์์ ์) -3์๋ฐํ
ํ๋ค. - ๊ฐ table์ ์ฒซ record๋ถํฐ key๋ฅผ ์๋ก ๋น๊ตํ๋ฉฐ ํ ์ชฝ์ด ์์ผ๋ฉด ์์ ์ชฝ์ advance, ๊ฐ์ผ๋ฉด ์ถ๋ ฅ ํ ๋ ๋ค advanceํ๋ ๊ฒ์ ๋ ์ค 1๊ฐ ์ด์ table์์ advance๊ฐ ๋ถ๊ฐ๋ฅํ ๋ ๋ง์ง๋ง record๋ฅผ ์ฒ๋ฆฌํ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- ๊ตฌํํ ํจ์๊ฐ ์ฑ๊ณต์ ๋ฐํํ๊ธฐ ์ด์ ์ ํ์ผ write๊ฐ ์๋ฃ๋์ด์ผ ํ๋ฏ๋ก, fsync ํจ์๋ฅผ callํ์ฌ ์ค์ disk write์ด ์ํ๋๋๋ก ํ๋ค.
- ์์ฒญํ์ฌ ํ์ฌ ์ฌ์ฉ ์ค์ด๋ page๋ฅผ ๋ชจ๋ releaseํ๊ณ file์ ๋ซ๋๋ค.
- 0(์ฑ๊ณต)์
๋ฐํ
ํ๋ค.
- ์ธ์๋ก ๋ฐ์ pathname์ ๊ฐ์ง๋ file์ (๋ฎ์ด)์ฐ๊ธฐ ์ ์ฉ์ผ๋ก openํ๋ค. ์คํจ ์ -1์
buffer_block_t* find_leftmost_leaf(buffer_block_t *header_buffer);
- index manager layer์ ๊ตฌํ
- ํน์ table์ header page (buffer block ํฌ์ธํฐ)๋ฅผ ์ ๋ ฅ๋ฐ๊ณ ํด๋น table์ leftmost leaf page๋ฅผ ํ์ํ์ฌ ๋ฐํํ๋ค.
- ํ์ฌ record์ key๋ ์๋ฃํ์ผ๋ก int64_t๋ฅผ ์ฌ์ฉํ๋ฏ๋ก index_find_leaf ํจ์์ ํด๋น ์๋ฃํ์ ์ต์๊ฐ์ key๋ก ์ ๋ ฅํ์ฌ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ค. ํ์ง๋ง key์ ๋ฐ๋ฅธ ํ์ ์์ ์์ด ์ํํ๋๋ก ์ถ๊ฐ์ ์ธ ํจ์๋ฅผ ๊ตฌํํ์๋ค.
- ๊ตฌ์ฒด์ ์ธ ๊ตฌํ๊ณผ ๊ทธ ์์๋ ์๋์ ๊ฐ๋ค.
- ํ์ฌ table์ด empty์ด๋ฉด NULL์ ๋ฐํํ๋ค.
- root page์์ ์์ํ์ฌ leaf page์ ์ด๋ฅผ ๋๊น์ง ๊ฐ internal page์์ leftmost child page, ์ฆ one more page์ ํ์์ ๋ฐ๋ณตํ๋ค.
- ํด๋น page์ buffer block ํฌ์ธํฐ๋ฅผ
๋ฐํ
ํ๋ค.
int advance(int *idx, buffer_block_t **cur_buf, page_t **cur_page);
- relational set operator layer์ ๊ตฌํ
- ํน์ page์์ ํ์ฌ ํ์ธํ record์ ๋ค์ record๋ก advanceํ๊ณ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ
๋ฐํ
ํ๋ค. ์ด๋ฅผ ์ํด ํด๋น page buffer์ ๊ทธ ์์ frame ํฌ์ธํฐ์ ์ฃผ์(caller์์ ํด๋น ํฌ์ธํฐ๋ค์ ์ ์ฅํ ํฌ์ธํฐ ๋ณ์๋ค์ ์ฃผ์), ํด๋น page์์ ํ์ฌ ํ์ธํ record์ index๊ฐ์ ์ฃผ์(caller์์ ํด๋น ๊ฐ์ ์ ์ฅํ ๋ณ์์ ์ฃผ์)๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค. - ๊ตฌ์ฒด์ ์ธ ๊ตฌํ๊ณผ ๊ทธ ์์๋ ์๋์ ๊ฐ๋ค.
- ํ์ฌ ํ์ธํ record์ index๊ฐ ํด๋น page์ key ๊ฐฏ์ - 1, ์ฆ ํด๋น page์ ๋ง์ง๋ง record์ index๋ณด๋ค ์์ผ๋ฉด index ๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค.
- ๊ทธ๋ ์ง ์๋ค๋ฉด, ํ์ฌ buffer๋ฅผ releaseํ๊ณ right sibling page buffer๋ฅผ requestํ ํ index์ 0์ผ๋ก ์ด๊ธฐํํ๋ค. ์ฆ ๋ค์ page๋ก ๋์ด๊ฐ๋ค. right sibling page number๊ฐ 0, ์ฆ ํ์ฌ page๊ฐ ๋ง์ง๋ง page์ผ ๊ฒฝ์ฐ -1(advance ์คํจ)์
๋ฐํ
ํ๋ค.
- 0(์ฑ๊ณต)์
๋ฐํ
ํ๋ค.
-
JOIN operation ์ถ๊ฐ๋ฅผ ์ํ layer ๊ตฌ์กฐ ๋ณ๊ฒฝ๊ณผ ๋ช ๊ฐ์ง ์ต์ ํ ์๋ ๋ฑ์ด ์กด์ฌํ๋ค.
-
Index
- ๊ณผ์ ์์ ์๊ตฌ๋ JOIN operation์ ๊ตฌํํ๊ธฐ ์ํ์ฌ API layer์ index manager layer ์ฌ์ด์ relational set operator layer๋ฅผ ์ถ๊ฐํ์๋ค.
- ์ด์ ๋ฐ๋ผ, API layer์ ๊ฐ ํจ์๊ฐ index manager ์์ ํจ์๊ฐ ์๋ relational set operator ์์ ํจ์์ wrapper function์ผ๋ก ์์ ๋์๋ค. ๋ํ join_table ํจ์๊ฐ ์ถ๊ฐ๋์๋ค.
- API layer์ join_table ํจ์(wrapper function)๊ฐ ํธ์ถํ rso_join_table ํจ์๋ฅผ relational set operator layer์ ๊ตฌํํ์์ผ๋ฉฐ, ํ์ layer์์ ๊ตฌํ๋ API๋ค์ wrapper function์ ํด๋น layer์ ์ถ๊ฐํ์๋ค.
- relational set operator layer์์ buffer๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด buffer_request_page์ buffer_release_page ํจ์์ wrapper function์ index manager layer์ ์ถ๊ฐํ์๋ค.
project3์์๋ ์ ์ถ์ผ๊น์ง ๋ฏธ์ฒ ๋ฐ๊ฒฌํ์ง ๋ชปํ, ์ฌ๋ฌ table์ closeํ ๋ ๋น์ ์์ ์ผ๋ก ์๋ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค.
buffer_close_table ํจ์์ ๋์์, ํด๋น table ๊ตฌ์กฐ์ฒด๋ฅผ buf_tables ๋ฐฐ์ด์์ ์ ๊ฑฐํ ๋, ํ ์นธ์ฉ ๋น๊ธฐ๊ธฐ ์ํด
for(i = table_index; i < table_num - 1; i++) {
buf_tables[i] = buf_tables[i - 1];
}
์์ ๊ฐ์ด ๊ตฌํํ์๋๋ฐ, +๋ก ์ ์ด์ผ ํ ๋ถ๋ถ์ -๋ก ์ ์ ์คํ๊ฐ ์์ด์ ์ ์์ ์ผ๋ก ์ํ๋์ง ์์๋ค.
for(i = table_index; i < table_num - 1; i++) {
buf_tables[i] = buf_tables[i + 1];
}
์์ ๊ฐ์ด ๊ตฌํํด์ผ ํ๋ค.
๋ํ, buffer_shutdown_db ํจ์์์
for(i = 0; i < table_num; i++) {
result += buffer_close_table(buf_tables[i].table_id);
}
์์ ๊ฐ์ด ๋ชจ๋ table์ close๋ฅผ ์ํํ๋๋ก ๊ตฌํํ๋๋ฐ,
buffer_close_table์ buf_tables ๋ฐฐ์ด์ ์์ผ๋ก ๋ฐ์ฐฉ์ํค๋ฉฐ ์ํ๋๊ธฐ์ buf_tables[i]๊ฐ ์๋ buf_tables[0]์ ์ฐ์์ ์ผ๋ก ์ ๊ฑฐํด์ผ ํ๊ณ ,
buffer_close_table์ table_num์ ๊ฐ์์ํค๋ฏ๋ก ์ด๋ฅผ ๋ฏธ๋ฆฌ ๋ณต์ฌํด๋ ํ ํด๋น ๊ฐ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ํํ์ฌ,
repeat = table_num;
for(i = 0; i < repeat; i++) {
result += buffer_close_table(buf_tables[0].table_id);
}
์์ ๊ฐ์ด ๊ตฌํํด์ผ ํ๋ค.
ํด๋น ๋ถ๋ถ์ ์์ ํ์๋ค.
- project 3์์๋ buffer block์ pin์ด evict ๋ฐฉ์ง ์ธ์๋ lock ๊ธฐ๋ฅ๋ ์ํํ๋ ๊ฒ์ผ๋ก ์คํดํ์ฌ, pin์ด ๊ฝํ page๋ฅผ ์ค๋ณต์ผ๋ก read/writeํ ์ ์๋๋ก ๊ตฌํํ์๋ค.
- lock์ ๊ดํด ์์
์ ๋ค์ผ๋ฉฐ ์คํดํ์์ ๊นจ๋ฌ์๊ณ , ํ์ฌ ๊ตฌํ์ ์ ์งํ ๊ฒฝ์ฐ ์ค๋ณต read๊ฐ ๋ถ๊ฐ๋ฅํด์ ๋์ผํ table์ joinํ ์ ์์์ ํ์ธํ๋ค. ๋ฐ๋ผ์ lock ๊ธฐ๋ฅ์ ์ํํ๋๋ก ๊ตฌํํ ๋ถ๋ถ์ ์ ๊ฑฐํ์๋ค.
- request ์ pin์ด ๊ฝํ ์์ผ๋ฉด ์คํจ๋ฅผ ๋ฐํํ๊ณ , pin์ด ์์ผ๋ฉด in_pinned ๊ฐ์ 1๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์, pinned ์ฌ๋ถ ํ์ธ ์์ด ํด๋น ๊ฐ์ 1 ์ฆ๊ฐ์ํค๋๋ก ๋ณ๊ฒฝํ์๋ค.
- release ์ is_pinned ๊ฐ์ 0์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ํด๋น ๊ฐ์ 1 ๊ฐ์์ํค๋๋ก ๋ณ๊ฒฝํ์๋ค.
- project3์์๋ buffer manager๊ฐ buffer block์ ๊ฐ table๋ณ๋ก linked list๋ก ์ฐ๊ฒฐํ์ฌ ๊ด๋ฆฌํ๊ณ , buffer๊ฐ ํน์ table ํน์ page์ request๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น linked list๋ฅผ ์ ํ์ ์ผ๋ก ํ์ํ์๋ค.
- ์ด๋ฐ ๊ตฌํ์ buffer block์ ์์ ๋น๋กํ๊ฒ ๋งค request๋ง๋ค ํ์ ์๊ฐ์ ์ฆ๊ฐ์ํจ๋ค. ์ค์ ๋ก 10๋ง / 100๋ง ๊ฐ์ ์ค๋ณต ์๋ random insert / find / delete๋ฅผ ์ํํ์์ ๋ buffer pool์ ํฌ๊ธฐ(์ต๋ buffer block ์)๊ฐ 400 > 1000 > 4000๊ฐ์ธ ์์๋ก ์คํ ์๋๊ฐ ๋น ๋ฆ์, ์ฆ buffer pool์ด ํด์๋ก ์๋๊ฐ ๋๋ ค์ง๋ ๋น์ ์์ ์ธ ๊ตฌ์กฐ์์ ์ ์ ์์๋ค.
- ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด buffer์ hash table์ ์ถ๊ฐํ์๋ค.
- hash๋ฅผ ์ ์ฉํ์ง๋ง table๋ณ๋ก ๊ฐ์ง๋ linked list๋ ์ ์งํ๋ค. ์ด๋ close_table์์ ์ฌ์ฉ๋๋ค. (์ ๊ฑฐํ๊ธฐ ์ํ ์๋จ ๊ณ ๋ ค ์ค)
- collision์ ํด๊ฒฐํ๊ธฐ ์ํด separate chaining(open hashing)์ ์ฌ์ฉํ์๋ค.
- hash bucket ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํํ๊ณ ์ด์ ๋ฐฐ์ด์ธ ์ ์ญ ๋ณ์๋ก hash table์ ๊ตฌ์ฑํ์๋ค. (init_db ํจ์์์ ์ ๋ ฅ๋ฐ์ buffer pool์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋์ ํ ๋นํด์ผ ํ๋ฏ๋ก ์ค์ ๋ก ๋ฐฐ์ด๋ก ์ ์ธํ ๊ฒ์ ์๋๊ณ ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ ์ ์ญ ๋ณ์๋ฅผ ์ ์ธํ์๋ค.)
- disk์์ ์ฝ์ ํ์ด์ง๋ฅผ buffer์ ์ฌ๋ฆฌ๋ create_buffer_block ํจ์์์ ํด๋น buffer block์ hash table์ ์ฝ์ ํ๊ธฐ ์ํด insert_to_hash_table ํจ์๋ฅผ ์ ์ธ/์ ์ํ์๋ค.
- buffer block์ evictํ๋ evict_buffer_block ํจ์์์ ํด๋น buffer block์ hash table์์๋ ์ ๊ฑฐํ๊ธฐ ์ํด delete_from_hash_table ํจ์๋ฅผ ์ ์ธ/์ ์ํ์๋ค.
- ์์ layer(index manager)์ ์์ฒญ์ ๋ฐ๋ผ buffer ์์ ํน์ table์ ํน์ page๋ฅผ ๋ฐํํ๋ buffer_request_page ํจ์์์ ํด๋น table id์ page number์ ํด๋นํ๋ buffer block์ hash table์์ ๋น ๋ฅด๊ฒ ํ์ํ๊ธฐ ์ํด find_from_hash_table ํจ์๋ฅผ ์ ์ธ/์ ์ํ์๋ค. (hash table์ ์ถ๊ฐํ ๋ชฉ์ )
- buffer_init_db ํจ์์์ buffer pool(buffer_block์ ๋ฐฐ์ด)์ ๋์ ํ ๋นํ ์ดํ, ๊ฐ์ ๊ฐ์์ hash_bucket ๋ฐฐ์ด์ ๋์ ํ ๋นํ์ฌ hash table์ ์์ฑํ๋ค.
- ๋์ผํ๊ฒ buffer_shutdown_db ํจ์์์ buffer pool์ freeํ ์ดํ hash_table์ freeํ๋ค. separate chaining์ผ๋ก ์ถ๊ฐ ํ ๋น๋ ์์ญ์, buffer_shutdown_db ํจ์ ์ด๋ฐ์ ๋ชจ๋ table์ closeํ ๋, ๊ฐ table์ ์ํ๋ ๋ชจ๋ buffer block์ evictํ๋ฉด์ ํด์ ๋๊ธฐ ๋๋ฌธ์ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
- ํ์ฌ ๊ตฌํ์์ ํน์ buffer block์ ํ์ํ๊ธฐ ์ํด์๋ table id์ page number ์ด 2๊ฐ๊ฐ ์ฌ์ฉ๋๋ฏ๋ก, ์ด๋ฅผ 1๊ฐ์ key๋ก ๋ง๋ค๊ธฐ ์ํด ์ฐจ์ธํ ํ์์ด ์ ์ํ Cantor pairing function์ ์ฌ์ฉํ์๋ค.
- ์ด๋ 2๊ฐ์ ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ uniqueํ 1๊ฐ ๊ฐ์ ๊ตฌํด์ค๋ค. intํ์ table id์, uint64_tํ์ page number๋ก ํด๋น ์์ ๊ณ์ฐํ๋ฉด, ํ์ฌ uint64_tํ์ผ๋ก ๋ key์์ overflow๊ฐ ๋ฐ์ํ๊ณ ์ค๋ณต key๊ฐ ์๊ธธ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ค๋ณต๋ key๊ฐ hash function์ ๊ฑฐ์ณ hash table์ ์ค๋ณต index์ ์ฝ์ ๋ ๋ separate chaining์ผ๋ก collision์ ํด๊ฒฐ๋๋ฉฐ, ์ค๋ณต index์์์ ํ์์ ํด๋น key๊ฐ ์๋ table id์ page number๋ฅผ ๊ฐ์ง๊ณ ์ํํ๋๋ก ํ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
- hash function์ ๋ฐ๋ก ํจ์๋ก ๋ง๋ค์ง๋ ์์์ผ๋ฉฐ ์์ 3๊ฐ hash table ๊ด๋ จ ํจ์์์ ๊ฐ๊ฐ cantor pairing function์ผ๋ก ๊ตฌํ key๋ฅผ hash size๋ก modular ์ฐ์ฐ์ ํ์ฌ hash ๊ฐ(ํด๋น data๊ฐ hash table์ ์ ์ฅ๋ index)์ ๊ตฌํ๋ค.
- ํ์ฌ ๊ตฌํ์์๋ 64bit ์ปดํจํฐ์์ 1๊ฐ buffer block์ด 4145bytes, 1๊ฐ hash_bucket์ด 28byte์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ n๊ฐ์ buffer block์ผ๋ก ์ด๋ฃจ์ด์ง buffer pool์ด ์์ ๋ ์ด์ ํฌ๊ธฐ๋ 4145n bytes๊ฐ ๋๋ค.
- hash table์ ๋งค์ฐ uniformํ์ฌ chaining์ด ์์ ๋ 28n bytes, ํ ์์น์ ๋ชจ๋ data๊ฐ chaining ๋ worst case์ 28(2n-1) bytes = (56n-28)bytes์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค. ์ด๋ buffer pool์ ์ฝ 0.68~1.35% ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋์ง๋ง, ์๋์ ๊ฐ์ด ํ์ ์๋๋ฅผ ๋น์ฝ์ ์ผ๋ก ํฅ์์ํค๋ฏ๋ก ๊ทธ๋งํ ๊ฐ์น๋ฅผ ๊ฐ์ง๋ค๊ณ ํ๋จํ์๋ค.
- ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ ์๋ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด์๋ค. intel i5-6600 CPU(4์ฝ์ด)๋ฅผ ๊ฐ์ง๋ ๋ฐ์คํฌํ PC์์ VM์ ์ค์น๋ ubuntu 18.04.3์ CPU 2์ฝ์ด, 8GB RAM์ ์ฃผ๊ณ ์ํํ์๋ค. host OS์์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ ๋ฑ ์์ ํ ํต์ ๋์ง ๋ชปํ ํ๊ฒฝ์ด์์ผ๋, ์ํ ์๊ฐ์ ์ฐจ์ด๊ฐ ์ปค์ ์ถฉ๋ถํ ์ฐ์ด์ ๊ฐ๋ฆด ์ ์์๋ค. ์ค๋ณต๋์ง ์์ 10๋ง ๊ฐ record์ random order insert / find / delete๋ฅผ testํด๋ณด์๋ค. ๊ฐ ์๊ฐ์ ๋ฐ๋ณต test๋ก ๊ตฌํ ์๊ฐ๋ค์ ํ๊ท ๊ฐ. (find์ delete๋ ์ฐพ๊ฑฐ๋ ์ญ์ ํ๋ 10๋ง ๊ฐ record๊ฐ ๋ชจ๋ insert๋ ์ํ์์ ์ํ. insert์ delete ํจ์๋ ์ฑ๊ณต ์ฌ๋ถ์ ์ฑ๊ณตํ count๋ฅผ log๋ก ์ถ๋ ฅํ๊ณ , find ํจ์๋ ์ฑ๊ณต ์ฌ๋ถ์ ์ฑ๊ณตํ count, ์ฐพ์ key/value๋ฅผ log๋ก ์ถ๋ ฅํด๊ฐ๋ฉฐ testํ์๋ค.)
Linear | Insert | Find | Delete |
---|---|---|---|
buffer 1๋ง | 57.0s | 56.9s | 397.8s |
buffer 1์ฒ | 42.3s | 6.8s | 121.7s |
buffer 1๋ฐฑ | 47.0s | 3.7s | 63.9s |
buffer 1์ญ | 50.0s | 3.4s | 58.3s |
Hash | Insert | Find | Delete |
---|---|---|---|
buffer 1๋ง | 6.9s | 3.2s | 3.9s |
buffer 1์ฒ | 24.1s | 3.3s | 47.1s |
buffer 1๋ฐฑ | 40.8s | 3.3s | 53.8s |
buffer 1์ญ | 47.3s | 3.7s | 56.5s |
- Linear search๋ buffer๊ฐ ๋์ด๋ ์๋ก ๋๋ ค์ง์ง๋ง hash๋ฅผ ์ฌ์ฉํ์ ๋๋ buffer๊ฐ ๋์ด๋ ์๋ก ๋นจ๋ผ์ง๋ ์ ์์ ์ธ ์ํ์๊ฐ์ ๋ณด์ด๋ฉฐ, ์ ์ฒด์ ์ผ๋ก hash์ ์ํ์๊ฐ์ด ๋น ๋ฆ์, ํนํ buffer๊ฐ ํด์๋ก ์๋ฑํ ๋น ๋ฆ์ ๋ณผ ์ ์๋ค.
- buffer์ ์๊ฐ ๋งค์ฐ ์ ์ ๋๋ linear ํ์์ด ๋ณ๋ก ์ค๋ ๊ฑธ๋ฆฌ์ง ์๋ ๊ฒ์ ๋นํด hash table์ ๊ด๋ฆฌํ๋ ๋ฐ์ ๋๋ resource๊ฐ ์์ด์ (์ ํ์์ buffer 10๊ฐ์ผ ๋ find ์ํ์๊ฐ๊ณผ ๊ฐ์ด) hash ์ฌ์ฉ์ด ๋ค์ ๋๋ฆฐ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์์ผ๋ ๊ทธ ์ฐจ์ด๊ฐ buffer๊ฐ ํด ๋ linear search๊ฐ hash๋ณด๋ค ๋๋ฆฐ ๊ฒ์ ๋นํด์๋ ํฌ์ง ์๊ณ , ์ํ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
- 100๋ง ๊ฐ record๋ฅผ 10๋ง/1์ฒ ๊ฐ buffer์์ ์ํํด๋ณธ ๊ฒฐ๊ณผ ๋์ฑ ํฐ ์ฐจ์ด๋ฅผ ํ์ธํ ์ ์์๋ค. ์ํ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ค์ ์ฌ๋ฌ ๋ฒ testํ์ฌ ํ๊ท ๊ฐ์ ๋ด๋ณด๊ธฐ๊ฐ ์ด๋ ค์ ํ๋ฅผ ์ฒจ๋ถํ์ง๋ ์์์ผ๋, data์ ์๊ณผ buffer์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก hash ์ฌ์ฉ์ด linear search๋ณด๋ค ํจ์ฌ ์ฐ์ํ ์ฑ๋ฅ์ ๋ณด์์ ์ ์ ์์๋ค.
- ๊ธฐ์กด index manager์ index_find, index_find_leaf ํจ์๋ ์ฃผ์ด์ง key๋ฅผ ๊ฐ์ง๋ record๋ฅผ ํ์ํ๊ธฐ ์ํด linear search๋ฅผ ์ฌ์ฉํ์๋ค.
- ์ฆ ๊ฐ๊ฐ์ internal page / leaf page์์ child page / record๋ฅผ ํ์ํ ๋ ์ ์ผ ์๋ถํฐ ๋๊น์ง key ๊ฐ์ ๋น๊ตํด๋ณด๋ฉฐ ํ์ํ์๋ค.
- ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด binary search์ ์ ์ฉ์ ์๋ํ์๋ค.
- ์ ์ผ ๋ง์ง๋ง์ 1๋ฒ๋ง ์ผ์ด๋๋ฉฐ ์ต๋ 31๊ฐ์ key๋ฅผ ๊ฐ์ง๋ leaf page์์์ ํ์๋ณด๋ค, ์ต๋ 248๊ฐ์ key๋ฅผ ๊ฐ์ง๋ internal page์์์ ํ์์ ๋จผ์ ์ ์ฉํด๋ณด๊ธฐ ์ํด index_find_leaf ํจ์๋ฅผ ์์ ํ์ฌ binary search๋ฅผ ์ ์ฉํด ๋ณด์๋ค.
- ํ์ง๋ง test ๊ฒฐ๊ณผ, ๋ ๊ฐ์ง search ๋ฐฉ์์ ์ฌ์ฉํ์ ๋ ํ๋ก๊ทธ๋จ ์ํ ์๊ฐ์์ ์ ์๋ฏธํ ์ฐจ์ด๋ฅผ ๋ณผ ์ ์์๋ค.
- ๋จ์ํ๊ฒ ์๊ฐํ์ ๋ linear search๋ O(n), binary search๋ O(log n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง, ํ์ฌ n์ด ์ต๋ 248๊ฐ๋ก ํ์ ๋ ์ํ์์ ์ด์ ๊ณฑํด์ง๋ ์์์ ์ฐจ์ด๊ฐ ํฌ๋ค๋ฉด ๋์ด ๋น์ทํ ์ํ ์๊ฐ์ ๊ฐ์ง ์๋ ์๊ณ ,
- ์ ์ฒด ์ํ ์๊ฐ์์ find ํจ์์ ๋น์ค์ด ์๋ค๋ฉด ํ๋ก๊ทธ๋จ ์ํ ์๊ฐ์ ๋น๊ต๋ก ๊ทธ ์ฐจ์ด๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์๋ ์๋ค๊ณ ํ๋จํ๋ค.
- ์ผ๋จ์ linear search๋ฅผ ์ ์ง. ์ถํ ๊ณผ์ ๋ฅผ ์ํํ๋ฉด์ ๋์ฑ ๋ค์ํ test๋ฅผ ํด๋ณด๊ณ , find ํจ์๋ ํด๋น search ์ํ๋ถ๋ถ์ ๊ดํด์๋ง ์ํ ์๊ฐ์ ์ธก์ ํด๋ณด๋ฉฐ, ๋ณด๋ค ๊ตฌ์ฒด์ ์ผ๋ก ๋ถ์ํด๋ณผ ์์ .
- ๊ธฐ์กด index manager์์๋, merge๋ฅผ ์ต๋ํ ์ค์ด๊ธฐ ์ํด redistribution์ ์ฐ์ ์ ์ผ๋ก ์ํํ๊ณ ์๋ค.
- redistribution์ ์ฎ๊ธด child page๋ค์ parent page number๋ฅผ ์์ ํด์ฃผ๊ธฐ ์ํด ๋ชจ๋ request/release๋ฅผ ๋ฐ๋ณตํ๋ฏ๋ก overhead๊ฐ ์ปค์ merge๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ํํ๋ ๊ฒ์ด ๋ ๋น ๋ฅผ ์๋ ์๋ค๊ณ ํ๋จํ์๋ค.
- ์ด์ ๋ฐ๋ผ, redistribution ์ฐ์ ๋ง์ ๊ณ ๋ คํ merge ํจ์๋ฅผ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋๋ก ์์ ํ ํ, merge๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ํํ๋๋ก ์๋ํ์๋ค.
- ํ์ง๋ง test ๊ฒฐ๊ณผ, ์์ ๋น์จ์ด์ง๋ง ํ๊ท ์ ์ผ๋ก merge๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ํํ ์ชฝ์ด ์คํ๋ ค ๋ ๋๋ฆผ์ ํ์ธํ์๋ค. ๋ํ, redistribution์ ์ฐ์ ์ ์ผ๋ก ์ํํ ๋์, ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ merge ํจ์ ์ฌ์ฉ๋ณด๋ค redistribution ์ฐ์ ๋ง์ ๊ณ ๋ คํ merge ํจ์ ์ฌ์ฉ์ด ์กฐ๊ธ ๋ ๋น ๋ฆ๋ ํ์ธํ์๋ค.
- ์ผ๋จ์ ๊ธฐ์กด์, redistribution ์ฐ์ ์ํ๊ณผ ๊ทธ๊ฒ๋ง์ ๊ณ ๋ คํ merge ํจ์๋ฅผ ์ฌ์ฉ. ์ถํ ๊ณผ์ ๋ฅผ ์ํํ๋ฉด์ ๋์ฑ ๋ค์ํ test๋ฅผ ํฌํจํ์ฌ ๊ตฌ์ ์ ์ผ๋ก ๋ถ์ํด๋ณผ ์์ .
- ๊ธฐ์กด index manager์๋, index_remove_entry_from_internal ํจ์์์ ์ฌ์ฉ๋๋, ํ์ฌ page buffer ํฌ์ธํฐ์ parent page buffer ํฌ์ธํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ ํ์ฌ page์ index๋ฅผ ๋ฐํํ๋ index_get_index ํจ์๊ฐ ์กด์ฌํ๋ค.
- index_insert_into_parent ํจ์์์ ์ฌ์ฉ๋๋, parent page buffer ํฌ์ธํฐ์ left page์ page number๋ฅผ ์ ๋ ฅ๋ฐ์ left page์ index๋ฅผ ๋ฐํํ๋ index_get_left_index ํจ์๋ ์ด์ ์ค์ง์ ์ผ๋ก ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ์ ์ญ์ ํ๊ณ index_get_index ํจ์๋ก ํตํฉํ์ฌ ์ฌ์ฉํ๋๋ก ์์ ํ์๋ค. ์ด ๊ณผ์ ์์, index_get_page ํจ์๊ฐ ํ์ฌ page buffer ํฌ์ธํฐ๊ฐ ์๋ ํ์ฌ page number๋ง ์ธ์๋ก ๋ฐ๊ณ ๋ ๋์ํ ์ ์์์ ํ์ธํ๊ณ ๊ทธ๋ ๊ฒ ์์ ํ์๋ค.
- index_delete_entry ํจ์์์ ์ฌ์ฉ๋๋, ํ์ฌ page buffer ํฌ์ธํฐ์ parent page buffer ํฌ์ธํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ ํ์ฌ page์ left neighbor page์ index๋ฅผ ๋ฐํํ๋ index_get_neighbor_index ํจ์๋ index_get_index ํจ์์ ๋ฐํ๊ฐ์ 1์ ๋บ ๊ฐ๊ณผ ๋์ผํ ๋ฐํ๊ฐ์ ๊ฐ์ง๋ฏ๋ก, ์ด ๋ํ ์ญ์ ํ๊ณ index_get_index ํจ์๋ก ํตํฉํ์ฌ ์ฌ์ฉํ๋๋ก ์์ ํ์๋ค.
- ํ์ฌ ํน์ leaf page ์ญ์ ํ right sibling page number๋ฅผ ์ฌ์ฐ๊ฒฐํด ์ค ๋, ์ญ์ ๋๋ page์ left page๋ฅผ ์ฐพ๊ธฐ ์ํด table์ leftmost leaf page๋ถํฐ ํ์ํ๋ค.
- ์ด๋ leaf page๊ฐ ์ฆ๊ฐ(record๊ฐ ์ฆ๊ฐ)ํ ์๋ก ๊ทธ์ ๋น๋กํด ํ์์๊ฐ์ด ์ฆ๊ฐํ๋ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋ฐฉ์์ด ํ์ํ๋ค.
- ํ์ฌ ์๋ก์ด disk page๋ฅผ buffer์ ์ฌ๋ฆฌ๊ธฐ ์ํด empty buffer๊ฐ ํ์ํ ๋, buffer pool์ ์ ํ์ ์ผ๋ก ํ์ํ๋ค. ์ด๋ buffer๊ฐ ์ปค์ง์๋ก, empty page๊ฐ ์ ์์๋ก ํ์ ์๊ฐ์ด ์ฆ๊ฐํ๋ ๋ฌธ์ ์ ์ ๊ฐ์ง๋ค.
- LRU list์ empty page๋ ๋ฃ์ด์ evict๋ ์ชฝ (least recently use๋ ์ชฝ)์ ๋ชฐ๋ ค์๋๋ก ํ๊ฑฐ๋, ๋ฐ๋ก list๋ก ๊ด๋ฆฌํ๋ ๋ฑ ๊ฐ์ ๋ฐฉ์์ด ํ์ํ๋ค.
- ํ์ฌ ๊ฐ๊ฐ์ ํจ์์์ ์๋ฌ ๋ฐ์ ์ ๊ทธ์ ๋ํ ์ ์ ํ ์กฐ์น ์์ด ๋จ์ํ ์์๊ฐ์ ๋ฐํํ๋ ๋ฑ ์๋ฌ ์ฒดํฌ๊ฐ ๋ฏธํกํ ์ํ์ด๋ค.
- ์ถํ recovery๋ฅผ ์ ์ฉํ ๊ฒ์ ๊ณ ๋ คํ๋ฉฐ ํจ์๋ค์ ๊ฐ ์์น์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ํด๋น transaction์ ์ํ์ ์ทจ์ํ๊ณ ๊ทธ ์ ์ํ๋ก ์จ์ ํ ๋ณต๊ตฌํ๋ ๋ฑ์ ์กฐ์น๊ฐ ํ์ํ๋ค.