1. key 순차 파ì�¼ A안 ¶
- Page 논�� 관하여
ìš°ì„ ì�´ë²ˆ 우리 APì�˜ ì ˆëŒ€ ì¡°ê±´ì�„ 알아보면,
- ��가 빨�야 한다.
- 페�지가 IO� 기본 단위�다.
- 가변길ì�´ ë ˆì½”ë“œë¡œ 한다.
위ì�˜ ë¬¸ì œë¥¼ 해결하기 위해 Page 구조를 변화시킨 ê²°ê³¼ 만들어진 모습 - ì†�ë�„ê°€ 빨ë�¼ì•¼ 한다.
~cpp
---------------------------------------------------------
- 페�지ID | 첫RecordID | FreeSpace | ptrToFree -
- (Word) | (Word) | (Word) | (Word) _
---------------------------------------------------------
- Record | Record | Record..... -
- (Record Size) | (R-Size) | (R-Size) -
---------------------------------------------------------
- ë¹„ì‹ ìž¥ 가변길ì�´ ë ˆì½”ë“œ & -
- FreeSpace -
---------------------------------------------------------
- - ... - Length - Length - Length - Last_ -
- - ... - ID - ID - ID - Slot_ -
- - ... - Pointer - Pointer - Pointer - Pointer -
---------------------------------------------------------
1.1. 세부설명 ¶
- 페ì�´ì§€ ID등 ì�¼ë°˜ì �ì�¸ í�¬ê¸° 단위를 Word로 하여 충분한 í�¬ê¸°ë¥¼ ì œê³µí•˜ê³ ì†�ë�„를 ë³´ìž¥ë°›ê³ ìž� 하며,,
- ID를 보다 ë¹ ë¥´ê²Œ ì ‘ê·¼í•˜ê¸° 위해서..
- Slotìž�ì²´ì—� ID를 í�¬í•¨ì‹œì¼°ê³ ,
DeleteMe ID �함시 �미 �금
- 페�지�� 첫
~cpp RecordID를 ì ‘ê·¼í• ìˆ˜ 있ë�„ë¡� 하였으며,
- Slotìž�ì²´ì—� ID를 í�¬í•¨ì‹œì¼°ê³ ,
- ë¶ˆí•„ìš”í• ê²ƒìœ¼ë¡œ íŒ�단ë�˜ëŠ”
~cpp NumberOfRecordê°’ì�€ 오버헤드차ì›�ì—�서 ì‚ì œì²˜ë¦¬í•˜ì˜€ê³ ,,
- LSP(Last Slot Pointer)는 슬롯� 있는 ID를 B-Search하기 위해서 가장 안쪽 슬롯� 위치를 가리키�� 함.
ë˜�한 슬롯ì�„ ì¶”ê°€í• ê²½ìš°ì—� ì¶”ê°€í• ìœ„ì¹˜ë¥¼ í�¬ì�¸í„°ë¡œì�¨ 바로 ì ‘ê·¼ í• ìˆ˜ 있ì�„것임.
- 기타 세부ì �ì�¸ ìˆ˜ì •ì�€ 보는ì�´ì�˜ íŒ�단ì�„ ìš”êµ¬í•˜ê³ ìžˆì�Œ.
1.2. ìž‘ë�™ë°©ì‹� ¶
- ì–´ë–¤ ë ˆì½”ë“œë¥¼ 삽입/ì‚ì œ/검색ì�„ í•˜ê³ ìž� í�¬ì�¸í„°ë¥¼ ì°¾ê³ ìž� í• ê²½ìš°ì—�..
ì œì�¼ ë¨¼ì € ê·¸ ë ˆì½”ë“œì�˜ ID와 페ì�´ì§€ ID를 비êµ�하여.. 페ì�´ì§€ë¥¼ 찾게 ë�˜ê³ ,
�� 슬롯� 있는 ID와 비�한 후,,
- ì‚ì œ/검색시ì—� 해당 í�¬ì�¸í„°ë¡œ ì�´ë�™í•˜ì—¬ 세부수행
- 삽입� 경우..
~cpp FreeSpace>Slot_Size+Record_Size와 비�후� 수행
1.3. ì¶”ê°€í•„ìš”ì‚¬í• ¶
- 페�지ID, 페�지 위치, 첫
~cpp RecordID를 찾거나 가는� IO 수행� 너무 많� 필요하다.
왜ëƒ�ë©´,, 비êµ�를 하기위해서 페ì�´ì§€ë¥¼ ì �ì–´ë�„ 한번ì�€ ì�½ì–´ì•¼ 하기 때문ì—�..
ì�´ì—� 마스터페ì�´ì§€(페ì�´ì§€ë“¤ì�˜ ì •ë³´ë¥¼ ì €ìž¥í•˜ê³ ìžˆëŠ” 페ì�´ì§€)를 따로 ì„ ì–¸í•´ì•¼ë§Œ 한다.
ê·¸ë ‡ê²Œ ë�œë‹¤ë©´, 첫~cpp RecordID까지ë�„ 마스터페ì�´ì§€ê°€ 관리하ë�„ë¡� í• ê²ƒìž„.
- 변수가 ì �ì�„수ë¡� 좋다. (관리가 ì �ì�„수ë¡� ë¹ ë¥´ë‹¤?!)
2. B안 ¶
공통
- í™”ì�¼ìƒ�성 - ë ˆì½”ë“œ 10000ê°œ, unsorted í™”ì�¼ ìƒ�성 (ìƒ�성 여부 확ì�¸ì�„ 위해 화면 ì¶œë ¥ 가능하ë�„ë¡� 구현)
2.1.1. 1. ë ˆì½”ë“œ ìž…ë ¥ - creat_s() ¶
키 순차화ì�¼ì�€ 키 순서로 ì •ë ¬ë�œ í™”ì�¼ì�„ ë§�한다.(êµ�재122p부터) 여기서 키는 primary key(첫번째 필드)ê°€ ë�œë‹¤.
unsorted ë ˆì½”ë“œë¥¼ sort하면서 page 단위 메모리ì—� ì �재를 하ë�˜, ì�´ë•Œ ì •ë ¬ 대ìƒ� ë ˆì½”ë“œë¥¼ 메모리ì—� 모ë‘� ì˜¬ë ¤ì„œ ì •ë ¬í•˜ì§€ ì•Šê³ , memory size 10ì�¸ ìž�ì—°ì„ íƒ�(êµ�재155p)ì�„ ì�´ìš©í•¨. 여기서 memory size 10ì�´ë�¼ëŠ” 것ì�€ 10ê°œì�˜ ë ˆì½”ë“œë¥¼ 올릴 수 있는 공간ì�„ ë§� í•˜ê³ , 가변 길ì�´ ë ˆì½”ë“œì�¼ 경우 ì‹¤ì œ 사ì�´ì¦ˆëŠ” ë³€í• ìˆ˜ 있다. ìž�ì—°ì„ íƒ� ì�´í›„, m-ì›� 다단계 합병(êµ�재166p).
ì •ë ¬ë�œ ë ˆì½”ë“œë¥¼ page(4KB) 단위로 ìž…ë ¥, pageì—�는 header와 slotì�´ 차지하는 공간ì�„ ì œì™¸í•œ í�¬ê¸°ë§Œí�¼ ë ˆì½”ë“œë¥¼ ì €ìž¥í• ìˆ˜ 있다. ë ˆì½”ë“œë¥¼ pageì—� ìž…ë ¥í• ë•Œ ë¹„ì‹ ìž¥ 가변길ì�´ ì €ìž¥ 방법ì�„ 사용, ìž…ë ¥ë� ë ˆì½”ë“œê°€ pageì�˜ 남ì�€ 공간보다 í�´ 경우 다ì�Œ pageì—� ìž…ë ¥ë�œë‹¤.
unsorted ë ˆì½”ë“œë¥¼ sort하면서 page 단위 메모리ì—� ì �재를 하ë�˜, ì�´ë•Œ ì •ë ¬ 대ìƒ� ë ˆì½”ë“œë¥¼ 메모리ì—� 모ë‘� ì˜¬ë ¤ì„œ ì •ë ¬í•˜ì§€ ì•Šê³ , memory size 10ì�¸ ìž�ì—°ì„ íƒ�(êµ�재155p)ì�„ ì�´ìš©í•¨. 여기서 memory size 10ì�´ë�¼ëŠ” 것ì�€ 10ê°œì�˜ ë ˆì½”ë“œë¥¼ 올릴 수 있는 공간ì�„ ë§� í•˜ê³ , 가변 길ì�´ ë ˆì½”ë“œì�¼ 경우 ì‹¤ì œ 사ì�´ì¦ˆëŠ” ë³€í• ìˆ˜ 있다. ìž�ì—°ì„ íƒ� ì�´í›„, m-ì›� 다단계 합병(êµ�재166p).
ì •ë ¬ë�œ ë ˆì½”ë“œë¥¼ page(4KB) 단위로 ìž…ë ¥, pageì—�는 header와 slotì�´ 차지하는 공간ì�„ ì œì™¸í•œ í�¬ê¸°ë§Œí�¼ ë ˆì½”ë“œë¥¼ ì €ìž¥í• ìˆ˜ 있다. ë ˆì½”ë“œë¥¼ pageì—� ìž…ë ¥í• ë•Œ ë¹„ì‹ ìž¥ 가변길ì�´ ì €ìž¥ 방법ì�„ 사용, ìž…ë ¥ë� ë ˆì½”ë“œê°€ pageì�˜ 남ì�€ 공간보다 í�´ 경우 다ì�Œ pageì—� ìž…ë ¥ë�œë‹¤.
2.1.2. 2. ë ˆì½”ë“œ 검색 - retrieve_s() ¶
ë ˆì½”ë“œì�˜ 효율ì �ì�¸ 검색or삽입orì‚ì œë¥¼ 위해서는 pageì�˜ 구조, page ì ‘ê·¼ì�„ 위한 구조가 잘 구성ë�˜ì–´ì•¼ 한다.
page ì ‘ê·¼ì�„ 위해 master page를 둔다. master page는 page들 중 가장 앞ì—� 위치한다.
master page는
page ì ‘ê·¼ì�„ 위해 master page를 둔다. master page는 page들 중 가장 앞ì—� 위치한다.
master page는
- â‘¡ page ë‚´ ë ˆì½”ë“œ 중 가장 í�° keyê°’,
- â‘¢ 현재 ì €ìž¥ë�œ ì „ì²´ ë ˆì½”ë“œ 수
- â‘£ 페ì�´ì§€ 수 등ì�„ ì €ìž¥í•œë‹¤.
master pageì—� |â‘¡|â‘ | 로 ì�´ë£¨ì–´ì ¸ 있는 tableì�„ 둔다.
keyê°’ì�´ 20ì�¸ ë ˆì½”ë“œë¥¼ ê²€ìƒ‰í•˜ê³ ì‹¶ë‹¤ë©´, master pageì�˜ tableì�„ ë³´ê³ í•´ë‹¹ page ID를 ì°¾ì�€ 다ì�Œ, page ë‚´ë¶€ì—�서 검색하게 ë�œë‹¤.
"page 내부�서 검색하는 것� 대해 논�해볼 필요가 있�."
keyê°’ì�´ 20ì�¸ ë ˆì½”ë“œë¥¼ ê²€ìƒ‰í•˜ê³ ì‹¶ë‹¤ë©´, master pageì�˜ tableì�„ ë³´ê³ í•´ë‹¹ page ID를 ì°¾ì�€ 다ì�Œ, page ë‚´ë¶€ì—�서 검색하게 ë�œë‹¤.
"page 내부�서 검색하는 것� 대해 논�해볼 필요가 있�."
2.1.3. 3. ë ˆì½”ë“œ 삽입 - insert_s() ¶
ë ˆì½”ë“œëŠ” 무조건 í™”ì�¼ì�˜ ë��ì—� 삽입한다.
master pageì�˜ page 수를 ì�½ê³ 가장 마지막 page로 ê°„ 다ì�Œ, page headerì�˜ freespace size를 삽입 ì˜ˆì • ë ˆì½”ë“œì�˜ í�¬ê¸°ì™€ 비êµ�하여, 만약 해당 pageì—� 충분한 공간ì�´ 있다면 그대로 추가 ìž…ë ¥, 충분한 공간ì�´ 없다면 다ì�Œ page를 ìƒ�ì„±í•˜ê³ ë„£ì–´ì£¼ëŠ” ë¹„ì‹ ìž¥ 가변길ì�´ 방법ì�„ ì�´ìš©í•œë‹¤.
'ë¹„ì‹ ìž¥'ì—� ì�˜í•´ pageì—� 어중간하게 남는 공간ì—�는 null flag를 둔다. ì�´í›„, ì¡°ê°�모ì�Œ.
master pageì�˜ page 수를 ì�½ê³ 가장 마지막 page로 ê°„ 다ì�Œ, page headerì�˜ freespace size를 삽입 ì˜ˆì • ë ˆì½”ë“œì�˜ í�¬ê¸°ì™€ 비êµ�하여, 만약 해당 pageì—� 충분한 공간ì�´ 있다면 그대로 추가 ìž…ë ¥, 충분한 공간ì�´ 없다면 다ì�Œ page를 ìƒ�ì„±í•˜ê³ ë„£ì–´ì£¼ëŠ” ë¹„ì‹ ìž¥ 가변길ì�´ 방법ì�„ ì�´ìš©í•œë‹¤.
'ë¹„ì‹ ìž¥'ì—� ì�˜í•´ pageì—� 어중간하게 남는 공간ì—�는 null flag를 둔다. ì�´í›„, ì¡°ê°�모ì�Œ.
2.1.4. 4. ë ˆì½”ë“œ ì‚ì œ - delete_s() ¶
ë ˆì½”ë“œ ì‚ì œëŠ” 검색→ì‚ì œì�˜ ë‘� ê³¼ì •ìœ¼ë¡œ ì�´ë£¨ì–´ì§„다.
ì‚ì œì™€ ë�™ì‹œì—� 해당 ë ˆì½”ë“œê°€ 있는 ìž�리ì—� null flag를 ë‘�ë�„ë¡� 한다. 다른 ë ˆì½”ë“œë“¤ì�´ page ê°„ ì�´ë�™í• 필요가 없다.
ì‚ì œì™€ ë�™ì‹œì—� 해당 ë ˆì½”ë“œê°€ 있는 ìž�리ì—� null flag를 ë‘�ë�„ë¡� 한다. 다른 ë ˆì½”ë“œë“¤ì�´ page ê°„ ì�´ë�™í• 필요가 없다.
2.1.5. 5. ë ˆì½”ë“œ êµ�ì²´ - replace_s() ¶
ë ˆì½”ë“œ êµ�체는 검색→êµ�ì²´ì�˜ ë‘� ê³¼ì •ìœ¼ë¡œ ì�´ë£¨ì–´ì§„다. 추가ì �ì�¸ ì•„ì�´ë””ì–´.
ë ˆì½”ë“œë¥¼ 검색한 후 해당 key ê°’ê³¼ ì�¼ì¹˜í•˜ëŠ” keyì�˜ ë ˆì½”ë“œë¥¼ ì§€ìš°ê³ ì‚½ìž…í•˜ê²Œ ë�œë‹¤. 가변길ì�´ ë ˆì½”ë“œ.
ë ˆì½”ë“œë¥¼ 검색한 후 해당 key ê°’ê³¼ ì�¼ì¹˜í•˜ëŠ” keyì�˜ ë ˆì½”ë“œë¥¼ ì§€ìš°ê³ ì‚½ìž…í•˜ê²Œ ë�œë‹¤. 가변길ì�´ ë ˆì½”ë“œ.
ì�´ë•Œ ìœ ì�˜ 사í•으로는 새로 들어가는 ë ˆì½”ë“œì�˜ 길ì�´ê°€ 기존 ë ˆì½”ë“œ 보다 길 경우 공간ì�´ 부족하다는 것.
"êµ�ì²´ 시 공간 부족 ë¬¸ì œì—� 대한 ë…¼ì�˜ê°€ 필요함"









