Chapter 9. Multilevel Indexing and B-Trees

Slides:



Advertisements
Similar presentations
2014년도 주요법령 개정사항 (월) ~ (금) 대한전문건설협회 강원도회.
Advertisements

자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
1. 자료구조 개념 (1) 자료구조의 개요 1) 자료구조 ① 일련의 자료들을 조직하고 구조화하는 것 ② 자료의 표현과 그것과 관련된 연산 2) 자료구조에 따라 저장공간의 효율성과 프로그램의 실행시간이 달라짐 3) 어떠한 자료구조에서도 필요한 모든 연산들을 처리하는 것이.
Internet Computing KUT Youn-Hee Han
8. 파일 인덱스: 탐색트리 (Search Tree)
C++ Espresso 제1장 기초 사항.
M원 탐색트리.
Chapter 7. Binary Search Trees - 보충 자료-
Internet Computing KUT Youn-Hee Han
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
Chapter 4. Fundamental File Structure Concepts
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
6장 트리.
MySQL performance Xhark 김재홍.
7장 : 캐시와 메모리.
8. 객체와 클래스 (기본).
Internet Computing KUT Youn-Hee Han
10장 객체-지향 프로그래밍 II ©창병모.
CHAP 7:트리.
강의 #7 트리(Tree).
쉽게 배우는 알고리즘 5장. 검색트리
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
6장. 물리적 데이터베이스 설계 물리적 데이터베이스 설계
ER-Win 사용 방법.
쉽게 배우는 알고리즘 5장. 검색트리.
제 8 장 이진 탐색 트 리 8.1 이진 탐색 트리 정의 8.2 이진 탐색 트리의 탐색 8.3 이진 탐색 트리의 삽입
Chapter 8. AVL Search Trees
Chapter 10. 파일 시스템 인터페이스(File System Interface)
파일 시스템 인터페이스(File System Interface)
자료구조 과제 풀이(6,7,8차) Yong-hwan Kim
강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
Tree & Heap SANGJI University Kwangman Ko
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
AVLTree vs 편향 Tree.
Chapter 3 클래스. 최호성.
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
동적 계획(Dynamic Programming)
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
운영체제 (Operating Systems) (Memory Management Strategies)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
Chapter 01 자료 구조와 알고리즘.
[CPA340] Algorithms and Practice Youn-Hee Han
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
Chapter 12 Memory Organization
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
5. 논리적 자료표현 : 구조체.
CHAPTER 04 파일 설계(FiLE Design).
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
Signature, Strong Typing
Signature, Strong Typing
IBM Corporation {haoxing, eleve, kravets,
제9장 가상 메모리 관리.
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
강의 #11 탐색(Search).
제 5 장 탐색트리.
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
Chapter 07 트리.
데이터 베이스의 내부 구조.
자료구조 자료구조의 개요 배열 선형 리스트 스택 큐 트리.
Dynamic Graph Query Primitives for SDN-based Cloud Network Management Ramya Raghavendra, Jorge Lobo, Kang-Won Lee 2012 HotSDN 정보통신공학과.
[CPA340] Algorithms and Practice Youn-Hee Han
C++ 언어의 특징
가상 기억장치 (Virtual Memory)
Presentation transcript:

Chapter 9. Multilevel Indexing and B-Trees

Contents Introduction: The Invention of the B-Tree Statement of the Problem Indexing with Binary Search Trees Multilevel Indexing: A Better Approach to Tree Indexes B-Trees: Working up from the Bottom Example of Creating a B-Tree An Object-Oriented Representation of B-Trees B-Tree Methods Search, Insert, and Others B-Tree Nomenclature

Contents (Cont.) Formal Definition of B-Tree Properties Worst-Case Search Depth Deletion, Merging, and Redistribution Redistribution During Insertion: A Way to Improve Storage Utilization B* Trees Buffering of Pages: Virtual B-Trees Variable-Length Records and Keys

1. Introduction: The Invention of the B-Tree 1979년 : “The Ubiquitous B-Tree” (Douglas Comer) 60년대 말 : 대형 화일 시스템 속의 데이터 저장과 검색을 위한 신속한 접근 방법의 발견에 대한 경쟁 1972년 : B-Tree 공개 R.Bayer와 E.McCreight의 논문 : “Organization and Maintenance of Large Ordered Indexes” 인덱스 일부는 주기억 장치, 나머지는 백업 저장 장치 B-Tree는 사실상 데이터베이스 시스템의 인덱스를 위한 표준 B-Tree 이름의 유래

2. Statement of the Problem 보조 기억 장소에 인덱스를 저장할 때 근본적인 문제점 : 보조 기 억 장치로의 접근이 느리다 1. 인덱스를 검색하는 것이 이진 탐색보다 빨라야 한다 이진 탐색의 경우: 1000개의 항목에서는 평균 9.5회의 탐색 요구 좀 더 적은 검색으로 키에 접근할 수 있는 방법이 필요 2. 삽입과 삭제는 검색만큼 빨라야 한다 하나의 키를 인덱스에 삽입할 때 모든 키의 이동을 초래한다면 비효율적 인덱스의 전체적 재구성이 아니라 부분적인 변화만을 줄 수 있는 키의 삽입과 삭제에 대한 방법

3. Indexing with Binary Search Trees 이진 탐색 트리의 문제 디스크 상주 인덱싱에 대해 충분히 빠르지 않음 트리의 균형을 잡는 효율적 기법의 부족 해결 방안 1. AVL Tree 2. Paged Binary Tree

Indexing with Binary Search Trees LV NP MB TM LA UF ND TS NK 를 차례로 입력할 때의 결과 KF FB SD CL HN PA WS AX DE FT JD NR RF TK YJ LV NP TM MB UF ND TS <Figure 9.6> Binary search tree showing the effect of added keys NK

Indexing with Binary Search Trees (1) AVL 트리 엔트리의 순서가 트리 구조를 결정하는데 중요 : <Figure 9.7> 해결책 : 트리 노드의 재구성 => AVL 트리 G. M. Adel’son-Vel’skii와 E. M. Landis 높이-균형(height-balanced) 트리 하나의 공통 루트(root)를 공유하는 두 개의 서브트리(subtree)의 높이 간의 허용되는 차이(최대 허용 차이:1) 높이-균형 1-트리(height-balanced 1-tree) 혹은 HB(1) 트리 A B C D E F G <Figure 9.7> A degenerate tree

Indexing with Binary Search Trees <Figure 9.8> AVL trees <Figure 9.9> Trees that are not AVL trees

Indexing with Binary Search Trees 예제 : 입력 키 “B C G E F D A” Worst-Case Search (N:가능한 키의 수) [1,000,000개의 키] E B D A G C F D A C E G B F <Figure 9.10> A completely balanced search tree <Figure 9.11> A search tree constructed using AVL procedures 완전 균형 탐색 트리 log2(N+1) 최대 20 level AVL 트리 1.44log2(N+2) 최대 29 level

Indexing with Binary Search Trees (2) 페이지화된 이진 트리 이진 탐색 트리의 문제: 디스크 사용도가 비효율적 디스크 읽기 : 최소 512바이트인 최소한 하나의 페이지를 생산 한 페이지 유용한 정보 : 키 값, 왼쪽, 오른쪽 서브트리 주소(3개) 대안 : 페이지화된 이진 트리 같은 디스크 페이지에 여러 개의 이진 노드를 위치시킴 페이지는 매우 많은 개별 레코드로 구성 디스크에서 필요로 하는 다음 정보가 방금 읽어 온 페이지에 있다면 디스크 접근 비용 절약

Indexing with Binary Search Trees 페이징(paging) 이진 탐색 트리의 비효율적인 디스크 사용도에 대한 해결책 이진 트리를 페이지로 나누고 각 페이지를 디스크의 연속된 위치의 블럭에 저장하여, 임의의 검색과 관련된 탐색의 수를 줄임 <Figure 9.12 Paged binary tree>

Indexing with Binary Search Trees 페이징의 장점 빠른 검색 가정: 페이지 크기는 511개 키/참조필드 쌍을 포함하는 8KB 완전 균형 포화 트리의 경우 : 134,217,727개의 키 (3번의 탐색) Worst-Case Search (N:트리에서의 키, k:하나의 페이지에 저장된 키의 수) 완전 포화 균형 이진 트리 log2(N+1) log2(134,217,727+1)=27 탐색 완전 포화 균형 트리의 페이지화된 버전 logk+1(N+1) log511+1(134,217,727+1)=3 탐색

Indexing with Binary Search Trees (3) 페이지화된 이진 트리가 가지는 문제점 키를 임의의 순서로 삽입할 때 : 페이지 당 3개의 키 입력 순서 : C S D T A M P I B W N G U R K E H O L J Y Q Z F X V D C S A M U B I P T W G K N R V Y E H J L O Q X Z F <Figure 9.13> Paged tree constructed from keys arriving in random input sequence

4. Multilevel Indexing: better approach to tree index 해결 방안 Bayer와 McCreight의 1972년 B-Tree 논문 위에서 아래로가 아니라 아래에서 위로 트리 구축 루트로부터 트리를 형성하는 문제점을 지적 B-Tree의 경우, 루트가 이미 만들어진 후 그것을 변경할 방법을 찾는 것보다 ,구성된 트리에서 루트가 나타나도록 함

5. B-Trees: Working up from the Bottom 삽입과 삭제의 선형 비용 문제를 해결하는 다단계 인덱스 해결 방법 인덱스 레코드가 가득차는 것을 요청하지 않음 초과되는 레코드를 두 개의 인덱스 레코드로 각각 반씩 분할 삭제는 필요할 때 두 개의 인덱스 레코드를 하나로 결합 B-Tree 각각의 노드는 인덱스 레코드 최대 포함 개수 : B-Tree의 차수(order), 키-참조 쌍의 최대 수 최소 포함 개수 : 차수의 반인 키-참조 쌍의 개수 예외 : Root (최소 두 개의 키-참조 쌍) 예> 차수 100인 B-Tree : 최소(50), 최대(100), 루트(두 키의 최소값)

B-Trees: Working up from the Bottom 가득차지 않은 인덱스 레코드에 새로운 키를 삽입하는 경우 인덱스 레코드의 갱신 (비용 적음) 인덱스 레코드에서 가장 큰 키 삽입 : 더 높은 레벨 갱신 인덱스 레코드에 삽입시, 레코드 크기 초과가 발생할 때 두 개의 레코드로 분할되고 각각 키의 반 포함 새로운 노드의 가장 큰 키가 다음 더 높은 레벨의 노드에 삽입 오버플로우가 발생하는 한 상승 계속 루트 레벨에 인덱스 레코드가 오버플로우면 분할: 높이 증가

6. Example of Creating a B-Tree Example : 차수 4 (노드 당 최대 4개의 참조 쌍)인 B-Tree C S D T A M P I B W N G U R K E H O L J Y Q Z F X V a) 초기 노드에 C,S,D,T 삽입 b) A의 삽입은 노드의 분할을 야기 각 단말 노드의 가장 큰 키(D와 T)를 루트 노드에 위치 C D S T D T A C D S T

Example of Creating a B-Tree c) M과 P는 오른쪽 단말 노드에 삽입되고 다음으로 I의 삽입은 이 노드의 분할을 야기한다 d) 단말 노드로의 B,W,N,G의 삽입은 또 다른 분할을 야기하며 현재 루트 노드가 가득 차 있다 D P T A C D I M P S T D M P W A B C D G I M N P S T W

Example of Creating a B-Tree e) U의 삽입은 아무런 변화없이 진행 R은 가득 차 있는 가장 오른쪽 단말에 삽입되어야 한다 f) R의 삽입은 가장 오른쪽 노드의 분할을 야기, 이로 인한 루트의 삽입 역시 분할되어진다. 트리는 3레벨로 증가한다 D M P W A B C D G I M N P S T U W P W D M P T W A B C D N P U W G I M R S T

Example of Creating a B-Tree g) K,E,H,O,L,J,Y,Q,Z의 삽입은 또 다른 노드의 분할을 야기한다 P Z D I M P T Z A B C D N O P U W Y Z E G H I Q R S T J K L M

Example of Creating a B-Tree h) F,X,V의 삽입으로 알파벳의 삽입이 끝난다 (26개의 문자 : 높이 3, 차수 4의 B-Tree) I P Z D G I M P T X Z A B C D J K L M Q R S T Y Z E F G M H I U V W X N O P # 삽입의 비용은 트리의 높이에 선형적

7. An Object-Oriented Representation of B-Trees 9.7.1 클래스 BTreeNode : 메모리에 B-Tree 노드 표현하기 <Figure 9.16> The main members and methods of class BTreeNode:template class for B-tree node in memory template <class keyType> class BTreeNode: public SimpleIndex <keyType> { public: // BTreeNode의 메모리에 대한 표현 형식 BTreeNode (int maxKeys, int unique=1); int Insert (const keyType key, int recAddr); int Remove (const keyType key, int recAddr=-1); int LargestKey(); // 가장 큰 키값을 되돌린다 int Split (BTreeNode<keyType>*newNode); // 새로운 노드 생성 int pack (IOBuffer& buffer) const; int Unpack (IOBuffer& buffer); protected: int MaxBKeys; // 노드 내 키의 최대 개수 int Init(); friend class BTree<keyType>; };

An Object-Oriented Representation of B-Trees 9.7.2 클래스 BTree : B-Tree 노드의 화일 지원하기 <Figure 9.17> Main members and methods of class BTree : whole B-tree implementation including methods Create, Open, Search, Insert, and Remove template <class keyType> class BTree { public: BTree (int order, int keySize=sizeof(keyType), int unique=1); int Open (char * name, int mode); int Create (char * name, int mode); int Close (); int Insert (const keyType key, const int recAddr); int Remove (const keyType key, const int recAddr=-1); int Search (const keyType key, const int recAddr=-1);

An Object-Oriented Representation of B-Trees Continued protected: typedef BTreeNode<keyType> BTNode; // 키를 가지는 단말의 아래쪽 가지를 메모리로 적재 BTNode * FindLeaf(const keyType key); BTNode * Fetch(const int recaddr); //노드를 메모리로 적재 int Store (BTNode *); // 노드를 파일에 저장 BTNode Root; int Height; // 트리의 높이 int Order; // 트리의 차수 BTNode ** Nodes; // 가지를 위한 저장 공간 // Nodes[1]은 레벨 1 이고, Nodes[Height-1]은 단말이다 RecordFile<BTNode> BTreeFile; }; 클래스 BTree : 메모리에 있는 BTreeNode 객체를 사용하고, 화일 접근 부분을 추가하고, 그 노드의 일정한 크기를 유지

8. B-Tree Methods Search, Insert, and Others B-Tree 메소드 : 9.8.1 검색 (Search) 트리 검색 절차 순환적 (recursive) 두 단계로 동작 전체 페이지에 (클래스 BTree) 대해서 연산 페이지에서 (클래스 BTreeNode) 연산

B-Tree Methods Search, Insert, and Others B-Tree 메소드 : 9.8.2 삽입 (Insert) 삽입, 분할, 상승 과정의 특징 삽입은 단말 수준까지 하향으로 계속 검색을 진행한 후에 시작 단말 수준에서 삽입 장소가 발견되면 삽입, 분할, 상승이 가장 아래 레벨로부터 윗 레벨로 전파 세 단계 순환하기 전에 메소드 FindLeaf를 사용하여 단말 레벨 검색 경로(path)의 윗 방향에 대해 삽입, 오버플로우 탐지 (overflow detection), 분할 현재 루트가 분할되어졌다면, 새로운 루트 노드를 생성 Insert 지원 함수 대표적 : BTreeNode::Split 그림 9.19 클래스 BTreeNode의 메소드 Split

B-Tree Methods Search, Insert, and Others Create 메소드 : 첫 번째 레코드가 루트 노드를 위해 예약되도록 BTreeFile 화일에 빈 루트 노드 기록 Open 메소드 : BTreeFile을 열고, 화일에서 첫 번째 레코드부터 메모리에 루트 노드 적재 Close 메소드 : 간단히 이 루트 노드를 BTreeFile에 저장하고 화일 닫기

B-Tree Methods Search, Insert, and Others B-Tree 메소드 : 9.8.4 B-Tree 검사하기 <Figure 9.20> Program tstbtree.cpp const char * keys = “CSDTAMPIBWNGURKEHOLJYQZFXV”; const int BTreeSize = 4; main (int argc, char *argv) { int result, i; BTree <char> bt (BtreeSize); result = bt.Create (“testbt.dat”, ios::in|ios::out); for (i = 0; i < 26; i++) { cout << “Inserting” << keys[i] << endl; result = bt.Insert(keys[i], i); bt.Print(cout); } return 1;

9. B-Tree Nomenclature B-Tree 용어의 형식적 정의 필요 (차수, 단말, B-tree) 차수 (Order) Bayer와 McCreight[9.1], Comer[9.2] 차수 : 트리의 한 페이지 안에 있는 키들의 최소 개수 Knuth 차수 : 한 페이지가 가질 수 있는 자손(descendant)들의 최대 개수 페이지 분할시 자손의 최소 개수 : m/2 (루트 제외) 단말 (Leaf) Bayer와 McCreight B-tree에서 가장 낮은 키의 레벨을 단말 레벨 B-Tree의 단말은 가장 낮은 레벨의 키보다 한 레벨 아래

B-Tree Nomenclature B-Tree vs. B+-tree 정의 차이 책의 B-Tree 정의 단말 노드에 완전한 인덱스를 가지고 있고, 더 높은 레벨 인덱스일수록 내부 노드를 이용 책과 다른 B-Tree의 정의 B-Tree는 단말 노드뿐만아니라, 모든 노드에서 데이타 레코드 참조 키의 중복을 제거하고, 대신에 내부노드에 데이타 레코드 참조를 포함 B+-tree 책의 정의 : 데이타 화일이 엔트리 순차 화일은 아니지만, 레코드들의 정렬된 블럭의 연결된 리스트로 구성 데이타 화일은 B-tree의 단말 노드와 같은 방법으로 구성 장점 : 인덱스화된 접근과 순차접근이 모두 최적화됨

10. Formal Definition of B-Tree Properties 차수 m 인 B-Tree의 성질 (B-tree of order m) 각 페이지는 최대 m개의 자식을 가진다 루트와 단말 페이지를 제외한 모든 페이지는 적어도 m/2의 자손을 가진다 루트는 적어도 두 개의 자손을 가진다 (단말 노드가 아닌 경우) 모든 단말 노드들은 동일한 레벨에 나타난다 단말 레벨은 연관된 데이타 화일의 완전하고 순서화된 인덱스 형태를 이룬다

11. Worst-Case Search Depth B-Tree의 페이지 크기, 트리에 저장되어 있는 키의 개수와 트리가 확장될 수 있는 레벨의 수 사이의 관계 이해 예) 1,000,000 개의 키를 저장하려 할 때 차수 512인 B-Tree(페이지 당 최대 511개의 키)를 이용 질문 : “최악의 경우, 트리에 하나의 키를 위치시키는데 요구되는 최대 디스크 접근 수는 얼마인가?” 답 : 단말 레벨에서 나타나는 모든 키를 기록하는 것에 의해 단말에 1,000,000 개 키를 가진 트리의 최대 높이의 계산 필요 주어진 차수를 가진 B-Tree 의 임의의 레벨에서부터 확장될 수 있는 최소 자손의 개수를 계산

Worst-Case Search Depth 차수 m인 B-Tree 루트 페이지로부터 최소 자손의 수 : 2 트리의 두 번째 레벨 : 두 페이지(각각 적어도 m/2의 자손) 세 번째 레벨 : 2 x m/2 (각각은 적어도 m/2의 자손 소유) 깊이와 자손의 최소 개수 사이 관계 레벨 자손의 최소 개수 1 (root) 2 3 : d 2 2 x m/2 2 x m/2 x m/2 or 2 x m/22 : 2 x m/2d-1

Worst-Case Search Depth 단말에 N개의 키를 가진 트리에 대한 키와 최소의 높이 d인 트리 사이의 관계 d에 대해 풀어보면 1,000,000개의 키를 가진 차수 512인 B-Tree에 대해 트리 깊이의 상한 1,000,000개의 키를 가진 차수 512인 B-Tree : 많아야 세 레벨 깊이 또는

12. Deletion, Merging, and Redistribution B-Tree가 좁고 깊기보다는 넓고 얕다는 것을 보장 루트 노드와 단말 노드들을 제외한 각 페이지는 적어도 m/2의 자손을 가진다 단말 노드는 최소 m/2 개의 키를 가지며, 최대 m개보다 하나 적은 수의 키를 가진다 키가 트리에서 삭제될 때 이런 성질을 유지 Figure 9.21 삭제동안 발생할 수 있는 3가지 상황 합병과 다른 변경은 B-Tree의 루트에서 전파 루트가 하나의 키와 하나의 자식을 가지면 제거 트리는 한 레벨 작아짐

Deletion, Merging, and Redistribution a) Figure 9.15(c)에서 키 C 삭제는 오직 단말 노드에서만 변화가 일어난다 I P Z D G M T X A B J K L Q R S Y E F H N O U V W C

Deletion, Merging, and Redistribution b) Figure 9.15(c)에서 P를 삭제한 결과, 두 번째 레벨과 루트에서 P가 O로 변경된다 I O Z D G I M O T X Z A B C D J K L M Q R S T Y Z E F G H I U V W X N O P

Deletion, Merging, and Redistribution c) Figure 9.15(c)에서 H를 삭제한 결과, H의 삭제는 언더플로우를 야기하고 두 단말 노드가 합병된다 I P Z D I M P T X Z A B C D J K L M Q R S T Y Z E F G I U V W X N O P

Deletion, Merging, and Redistribution B-Tree에서 노드 n에서부터 키 k를 삭제하는 규칙 1. 만약 n이 키의 최소 개수 이상이고 키가 n에서 가장 크지 않다면, 간단히 n에서부터 k를 삭제한다 2. 만약 n이 키의 최소 개수 이상이고 k가 n에서 가장 크다면, k를 삭제하고, n의 새로운 가장 큰 키를 반영하기 위해 더 높은 레벨 인덱스를 변경한다 3. 만약 n이 정확히 키의 최소 개수를 가지고, n의 형제(sibling) 중의 하나가 충분히 작은 키를 가진다면, 그것의 형제와 n을 합병하고 부모 노드로부터 키를 삭제한다 4. 만약 n이 정확히 키의 최소 개수를 가지고, 형제 중의 하나가 여분의 키를 가진다면, 형제로부터 n까지 몇 개의 키를 옮김으로써 재분배한다. 그리고 영향 받은 노드에 새로운 가장 큰 키를 반영하기 위해 더 높은 레벨의 인덱스를 변경한다

Deletion, Merging, and Redistribution Figure 9.22 차수가 5인 B-Tree의 예 (키 C,M,W의 삭제를 고려) 규칙 3과 4 (Figure 9.22) 충분히 적은 키(few enough keys) : 합병을 허용 여분의 키 (extra keys) : 재분배를 포함 삭제의 구현은 규칙 3과 4 모두 적용 가능할 때 어떤 규칙을 사용할 지 선택 E N U Z A C E V W Z K M N P R S T U

Deletion, Merging, and Redistribution 재분배와 분할, 합병과의 차이 트리에 노드 모임(collection)이 변화되는 것을 야기하지 않음 지역적인 효과(local effect)를 가진다는 것 보장 재분배 알고리즘 : 논리적으로 인접할 때도 형제가 아닌 노드들 사이에 키를 옮기는 것은 고려하지 않음 형제(sibling) : 페이지들이 같은 부모 페이지를 가졌다는 것

13. Redistribution During Insertion: A Way to Improve Storage Utilization 노드 분할의 대체 방안으로 재분배를 사용하는 것의 장점 삽입시 재분배 : 새로운 페이지 생성을 피하거나 적어도 연기 꽉 찬 페이지를 분할하여 두 개의 반쯤 찬 새로운 페이지의 생성보다 재분배는 오버플로우된 키를 다른 페이지에 저장 공간 이용의 효율성 : 한 노드가 분할된 뒤 두 페이지는 반만큼 꽉 차 있으므로 최악의 경우 공간 이용율은 두 페이지 분할을 이용할 경우 50%정도 Yao(1978)의 증명 :공간 이용율은 이론적으로 평균 약 69% 접근 분할의 대체 방법으로 형제가 다 찼을 때만 분할하는 삽입시의 재분배 Bayer와 McCreight의 논문(1972)에서 소개 재분배의 사용은 공간 이용율은 86%로 향상 큰 화일에 대한 B-Tree의 응용이 가능할 때, 재분배를 통해 오버플로우를 처리하는 삽입 절차를 구현

14. B* Trees 1973년 Knuth(1998)는 삽입시의 재분배 개념 => B*-Tree 재분배를 통해 분할을 연기하는 시스템에서 분할한 페이지를 둘로 나누기 보다 둘을 셋으로 나누는 방법의 가능성 제시 두 페이지를 셋으로 분할하는 방법은 분할된 페이지가 반으로 차기보다는 2/3정도로 찬다는 측면 B*-Tree의 성질 1. 각 페이지는 최대 m개의 자손을 가진다 2. 루트 노드와 단말 노드를 제외한 각 페이지는 적어도 (2m-1)/3 개의 자손을 가진다 루트 노드는 적어도 두 개의 자손 노드를 가진다 (이것이 단말 노드가 아닐 경우) 모든 단말 노드는 동일한 레벨에 나타난다

B* Trees 기존 B-Tree의 정의와 성질에서 특징적으로 달라진 것 : 규칙2 하나의 B*-Tree는 최소 (2m-1)/3 개의 키를 가진 페이지들로 이루어짐 삭제와 재분배의 절차에 영향 형제를 갖지 않는 루트를 분할하는 문제 2개를 3개로 분할이 불가능 Knuth : 루트 페이지의 경우 다른 페이지보다 큰 크기로 확장될 수 있도록 하고, 분할될 때는 2/3만큼 찬 두 개의 페이지를 생성할 수 있는 방법을 제안 장점 : 루트 아래에 있는 모든 페이지들이 B*-Tree의 특성을 가진다는 것을 보장 단점 : 다른 페이지들보다 큰 페이지를 다룰 수 있는 절차 필요

15. Buffering of Pages: Virtual B-Trees 전체를 메모리에 저장하기에 너무 큰 인덱스의 효율적 사용 예) 1MB의 레코드를 포함하는 인덱스, 메모리의 크기 : 256KB, 페이지 크기 : 4KB (64 키/페이지) 루트를 메모리에 유지하는(keep-the-root) 단순한 전략보다 일반적인 방법을 제안 제안된 방법 – 가상 B-Tree (virtual B-Tree) 루트 페이지뿐만 아니라 다수 B-Tree 페이지를 보관하는 페이지 버퍼(page buffer)를 생성 : 메모리 버퍼를 이용하는 B-Tree를 가상 B-Tree (virtual B-Tree) 사용자의 요구에 따라 디스크로부터 페이지들을 읽으면서 버퍼를 채움 페이지가 요구되는 경우 먼저 메모리에 접근 메모리에 그 페이지가 존재하지 않다면 그 페이지를 보조 기억장치에서 버퍼로 읽어와 이전에 버퍼에 있던 페이지와 교체 구현 : Node 멤버와 Fetch, Store 메소드를 사용 Fetch, Store : 필요할 때마다 디스크에서 읽거나 쓰지 않고, 메모리에 어떤 노드들이 있는 지를 유지

Buffering of Pages: Virtual B-Trees - LRU Replacement - 버퍼링 기법 : 버퍼에 있는 페이지를 요구할 때 사용 LRU(Least Recently Used) 교체: 최근에 가장 적게 사용된 페이지를 교체하는 것 Webster의 연구: LRU 교체 전략을 사용 Webster의 결과 요약 페이지 버퍼의 수를 달리 했을 때 검색 당 평균 디스크 접근 횟수 결과는 페이지 높이를 고려하지 않음 메모리에 트리의 15%(총140개중 20개의 페이지)보다 작게 저장하고 있는 것은 검색 당 평균 접근 횟수를 1보다 작은 값으로 감소 Buffer Count 1 5 10 20 검색당 평균 접근 횟수 3.00 1.17 1.42 0.97 키의 수 = 2400 총 페이지 = 140 트리 높이 = 3 레벨

Buffering of Pages: Virtual B-Trees - Replacement Based on Page Height - 루트를 메모리에 유지하는 (Keep-to-root) 전략 트리의 가장 높은 레벨의 페이지들를 유지하는 전략 예) 메모리 : 256KB, 인덱스 : 1MB, 페이지 크기 : 4KB(64개 페이지 저장) 1MB의 인덱스 : 디스크에서 1.2MB의 용량 요구(저장 이용률:83%), 4KB의 페이지 크기로 1.2MB는 300 페이지 요구, 평균적으로 각 페이지가 30개의 자손 3레벨 트리가 루트 레벨에서 하나의 페이지와, 두 번째 레벨에서 9 혹은 10개의 페이지, 그리고 나머지 단말레벨 페이지 높은 레벨의 페이지를 항상 보유하는 교체 전략을 사용하기 때문에 64페이지의 버퍼가 루트와 두 번째 레벨에 있는 노드들을 우선적으로 저장 나머지 50개 정도의 버퍼 슬롯에 단말 레벨 페이지들을 저장 어떤 페이지를 교체할 것인가에 대한 결정은 LRU 기법으로 처리 검색당 디스크 접근의 평균수가 1보다 작은 값으로 감소

16. Variable-Length Records and Keys 가변 길이를 제어하는 방법 연관 정보를 다른 가변길이 레코드 화일에 저장 (B-Tree는 다른 화일에 있는 정보에 대한 참조 포함) B-Tree 페이지에 키와 레코드의 가변 개수(variable number)를 허용 페이지당 가변 개수의 키를 가진 B-Tree : 하나의 고정된 차수가 존재하지 않음 (지금까지는 B-Tree의 차수 m을 가정) 길이에 대한 다양성 => 다른 종류의 페이지 구조 이용 (10장)