Chapter 10. Indexed Sequential File Access and Prefix B+-Trees
Contents Indexed Sequential Access Maintaining a Sequence Set Adding a Simple Index to the Sequence Set The Content of the Index: Separators Instead of Keys The Simple Prefix B+-Tree Simple Prefix B+-Tree Maintenance Index Set Block Size Internal Structure of Index Set Blocks: A Variable-Order B-Tree Loading a Simple Prefix B+-Tree B+-Trees B-Trees, B+-Trees, and Simple Prefix B+-Trees in Perspective
1. Indexed Sequential Access 인덱스 순차 화일(indexed sequential file) 구조 인덱스화(indexed) : 키에 대해 인덱스된 레코드의 집합 순차적(sequential) : 물리적으로 연속된 레코드 두 가지 관점 중 하나를 선택 인덱스 순차 접근 방법 두 가지 방식을 모두 포함
2. Maintaining a Sequence Set 레코드들의 순서화된 집합 (1) 블럭의 이용 레코드들을 블럭으로 모음 레코드의 삽입 => 오버플로우(overflow) 발생 레코드의 삭제 => 언더플로우(underflow) 발생
Maintaining a Sequence Set <Figure 10.1> 순차 집합에서 삽입과 삭제로 인한 블럭의 분할과 병합 Block 1 ADAMS . . . BAIRD . . . BIXBY . . . BOONE . . . Block 2 BYNUM . . . CARSON . . . COLE . . . DAVIS . . . Block 3 DENVER . . . ELLIS . . . (a) Block 1 ADAMS . . . BAIRD . . . BIXBY . . . BOONE . . . Block 2 BYNUM . . . CARSON . . . CARTER . . . Block 3 DENVER . . . ELLIS . . . Block 4 COLE . . . DAVIS . . . (b) Block 1 ADAMS . . . BAIRD . . . BIXBY . . . BOONE . . . Block 2 BYNUM . . . CARSON . . . CARTER . . . Block 3 Available for reuse Block 4 COLE . . . DENVER . . . ELLIS . . . (c)
Maintaining a Sequence Set (2) 블럭 크기의 선택 블럭 : 입출력 연산의 기본 단위 고려1 메모리가 한 번에 여러 개의 블럭들을 가질 수 있어야 함 고려2 순차 집합에서 임의 접근 문제 합리적 제안 : 블럭을 클러스터의 크기로 잡음
3. Adding a Simple Index to the Sequence Set 레코드의 키가 주어질 때 그 레코드를 포함하는 블럭 찾는 방법 각 블럭의 마지막 레코드의 키로 고정길이 인덱스를 형성 <Figure 10.2> 각 블럭에서 키의 범위를 보여주는 블럭들의 순서 ADAMS-BERNE FOLKS-GADDIS BOLEN-CAGE CAMP-DUTTON EMBRY-EVANS FABER-FOLK 1 2 3 4 5 6 Key Block number BERNE CAGE DUTTON EVANS FOLK GADDIS 1 2 3 4 5 6 <Figure 10.3> 위 순차 집합에서의 단순 인덱스
Adding a Simple Index to the Sequence Set 인덱스가 메모리에 유지되어야 하는 이유 이진 탐색을 통해 레코드를 찾음 블럭이 갱신됨에 따라 인덱스도 갱신 필요 인덱스를 메모리에 포함하지 못하는 경우 인덱스의 구조를 페이지로 나누어 다룸 B-트리는 메모리에 전부 포함하지 못하는 인덱스를 다루기 좋은 화일 구조 블럭의 순차집합에 대한 B-트리 인덱스를 이용
4. Content of the Index: Separators Instead of Keys 이 장에서 구성하려는 인덱스 목적 : 특정한 키를 가지고 레코드를 탐색할 때 효율적 순차 집합에 대해 일종의 지도(road map)처럼 작용한다 인덱스 집합에서는 키를 가질 필요가 없음 분리자(separator) 필요 Separators: BO CAM E F FOLKS ADAMS-BERNE FOLKS-GADDIS BOLEN-CAGE CAMP-DUTTON EMBRY-EVANS FABER-FOLK 1 2 3 4 5 6 <Figure 10.4> 순차 집합에서 블럭들간의 분리자
The Content of the Index: Separators Instead of Keys 분리자를 가변길이로 다룰 경우 인덱스 구조에서 가장 짧은 분리자 (shortest separator)를 이용 분리자에 따른 검색 규칙 탐색 키와 분리자와의 관계 결정 키 < 분리자 키 = 분리자 키 > 분리자 왼쪽 검색 오른쪽 검색 오른쪽 검색
5. The Simple Prefix B+-Tree B-트리 인덱스 + 순차집합 => 단순 전위 B+-트리 단순 전위 B+-트리(simple prefix B+-Tree) 단순 전위 : 인덱스 집합이 가장 짧은 분리자를 포함 키의 복사가 아닌 키의 prefix 를 포함
Simple Prefix B+-Tree Maintenance <Figure 10.7> 단순 전위 B+-트리를 형성하는 순차 집합을 위한 B-트리 인덱스 집합
6. Simple Prefix B+-Tree Maintenance (1) 순차 집합에서 한 블럭에 국한된 변화 병합을 일으키지 않는 레코드의 삭제 순차 집합 블럭 수가 변하지 않음 블럭간 레코드의 이동이 없음 따라서 인덱스 집합도 그대로 유지됨 예) EMBRY, FOLKS 레코드의 삭제 (Figure 10.8) 분할을 일으키지 않는 레코드의 삽입 위의 예와 같은 효과 인덱스 집합은 변하지 않음
Simple Prefix B+-Tree Maintenance <Figure 10.8> 순차 집합에서 EMBRY와 FOLKS 레코드를 삭제는 인덱스 집합을 변화시키지 않음 ERVIN-EVANS
Simple Prefix B+-Tree Maintenance (2) 인덱스 집합에서 여러 개의 블럭을 수반하는 변화 블럭의 수가 늘어난 경우 (블럭의 분할) 새로운 분리자가 인덱스 집합에 삽입되어야 함 블럭의 수가 줄어든 경우 (블럭의 병합) 하나의 분리자가 반드시 인덱스 집합으로부터 제거되어야 함 레코드가 블럭 사이에서 재분배된 경우 인덱스 집합에서 분리자의 값이 반드시 변경되어야 함 인덱스 집합의 수정을 요구
Simple Prefix B+-Tree Maintenance 분할을 일으키는 삽입 예제 <Figure 10.9> 블럭1에 대한 삽입은 분할을 일으키고 그 결과로 블럭 7이 생성 블럭의 추가는 인덱스 집합에서 새로운 분리자를 요구 분리자 AY의 삽입은 B-트리 인덱스 집합에서 노드의 분할을 일으킴 그 결과로 BO가 루트로 상승
Simple Prefix B+-Tree Maintenance 병합을 일으키는 삭제 예제 <Figure 10.10> 블럭2에서의 삭제는 언더플로우를 일으키고 블럭2와 3의 병합을 일으킴 병합 후에 블럭3은 더 이상 필요없기 때문에 분리자 CAM 제거 CAM의 제거는 인덱스 집합 노드들의 병합을 일으킴 루트로부터 분리자 BO를 다시 내려오게 함
7. Index Set Block Size 인덱스 집합 블럭 (index set block) 인덱스 집합 노드의 물리적 크기 = 순차 집합에서 블럭 크기 순차 집합 (sequence set) 블럭과 같은 크기를 사용하는 이유 가장 잘 맞는 블럭의 크기는 인덱스 집합에도 가장 좋음 가상 단순 전위 B+-트리를 생성하기 위한 버퍼링 방법의 구현을 쉽게 해줌
8. Internal Structure of Index Set Blocks: A Variable-Order B-Tree 가변적 차수를 가지는 인덱스 집합 분리자가 가변이지만 이진 탐색을 할 수 있도록 블럭 구조화 분리 인덱스: 가변길이 개체가 이진 탐색을 수행 예) Aa, Ba, Bro, C, Ch, Cra, Dele, Edi, Err, Fa, Fle RBN (relative block number : 상대 블럭 번호) 고정 길이 블럭을 참조 N개의 분리자 => N+1 개의 자식, N+1개의 상대 블럭 번호 인덱스 집합 블럭 (Index set block) 검색하려는 순차 집합으로 유도 AaBaBroCChCraDeleEdiErrFaFle 00 02 04 07 08 10 13 17 20 23 25 Concatenated separators Index to separators
Internal Structure of Index Set Blocks: A Variable-Order B-Tree 인덱스 집합 블럭 구조 분리자, 분리자의 인덱스, RBN의 결합 분리자 개수 (separator count): 이진 탐색을 위해 중간 원소를 찾는데 필요 분리자 전체 길이 (total length of separators): 인덱스 시작을 찾기 위해 필요 Separator count Total length of separators AaBaBroCChCraDeleEdiErrFaFle 00 02 04 07 08 10 13 17 20 23 25 B00 B01 B02 B03 B04 B05 B06 B07 B08 B09 B10 B11 11 28 Separators Index to separators Relative block numbers <Figure 10.12> 인덱스 집합 블럭의 구조
Internal Structure of Index Set Blocks: A Variable-Order B-Tree 검색 예 Beck 키를 갖는 레코드를 찾는 경우 Figure 10.12 의 인덱스 집합 블럭을 검색 1. 분리자 계수와 분리자 전체 길이를 통해 중간에 위치한 인덱스를 찾음 2. 이진 탐색 수행 – Beck는 Ba와 Bro 사이에 있음 3. Figure 10.13을 통해 검색하려는 다음 블럭이 RBN 벡터 B02 위치에 저장됨을 알 수 있음 Separator subscript: B00 As B01 Ba B02 Bro B03 C B04 Ch B05 Cra B06 Dele B07 Edi B08 Err B09 Fa B10 Fle B11 0 1 2 3 4 5 6 7 8 9 10 <Figure 10.13> 분리자와 상대 블럭 번호 사이의 개념적인 관계
9. Loading a Simple Prefix B+-Tree 1. 순차 집합에 블럭들을 추가, 순차 집합과 인덱스 집합에서 블럭을 분할 재분배하여 구성 각 삽입에 대해 트리를 탐색 후 트리를 재구성 재분배, 분할이 상대적으로 비쌈 2. 정렬된 화일 사용하여 순차 집합에 레코드를 하나씩 저장 작업 블럭이 채워졌을 때, 새로운 블럭에서 시작 두 개의 순차 집합 블럭 간의 차이를 통해 shortest separator 결정
Loading a Simple Prefix B+-Tree 정렬된 화일을 사용한 적재의 예 순차 집합 블럭과 순차 집합에서 유도된 shortest separator로 구성된 인덱스 집합 형성 분리자(ALW, ASP, BET) 인덱스 집합이 꽉 찬 상태, 다음 분리자는 CAT ALWASPBET 00 03 06 Next separator : CAT Next sequence set block: ACCESS-ALSO ALWAYS-ASK ASPECT-BEST BETTER-CAST CATCH-CHECK <Figure 10.14> 순차 집합이 적재될 때 초기 인덱스 집합 블럭의 형성
Loading a Simple Prefix B+-Tree CAT을 추가하기 위해 하나의 부모 노드 필요 상위 레벨 블럭은 곧바로 순차 집합을 가리킬 수 없음 분리자가 없는 인덱스 블럭 생성 두 레벨에서의 작업 현상(working-on-two-levels phenomenon) CAT 00 -1 -1 ALWASPBET 00 03 06 -1 -1 -1 분리자가 없는 인덱스 블럭 ACCESS-ALSO ALWAYS-ASK ASPECT-BEST BETTER-CAST CATCH-CHECK <Figure 10.15> 순차 집합이 점점 커지면서 동시에 형성되는 두 개의 인덱스 집합 레벨
Loading a Simple Prefix B+-Tree <Figure 10.16> 순차 집합에서 구성되었던 인덱스 집합의 지속적인 성장
Loading a Simple Prefix B+-Tree 정렬된 화일을 사용하는 적재 과정의 잇점 결과가 순차적으로 기록 적재시 어떤 블럭도 재구성할 필요가 없음 두 가지 부가적인 장점 (적재된 후의 성능과 관계됨) 순차 적재 과정은 원하는 블럭 효율성을 선택할 수 있음 임의 삽입은 평균 67~80% 사이의 꽉 찬 블럭 생성 순차 적재 과정은 블럭의 빈 공간 위치나 양을 제어할 수 있음 인덱스집합 블럭이 물리적으로 인접한 순차 집합 블럭 화일내의 공간적 지역성을 가능케 함 탐색을 최소화
10. B+-Trees 단순 전위 B+-트리를 사용하는 이유 B+-트리의 변형 (분리자로 prefix를 사용함) 인덱스 집합에서 분리자 역할과 순차 집합에서 키 역할 구분 인덱스 집합을 가능한 한 얕게(swallow) 만들기 위해 인덱스 집합 블럭에 가능한 한 많은 분리자 저장 B+-트리를 선호하는 이유 (분리자로 키의 복사본을 사용) 순차 집합에서 키의 고정길이 복사본을 분리자로 사용 분리자를 가변길이로 사용하는데 드는 오버헤드 비용이 큼
11. B-Trees, B+-Trees, and Simple Prefix B+-Trees 공유하는 특징 페이지화된 인덱스 구조 : 트리가 얕고 넓은 특징을 지님 높이에 있어 균형을 유지 상향식으로 생성되고, 균형은 분할, 합병, 재분배를 사용 2-3분할, 재분배를 통해 공간 효율성을 가짐 메모리에 가장 최근에 사용한 블럭들을 유지하는 가상 트리 구조로 구현 가능 가변길이 레코드를 처리할 수 있는 방법
B-Trees, B+-Trees, and Simple Prefix B+-Trees in Perspective 차이점 B-트리 구현이 간단함, 인덱싱의 상속효과, B-트리 넓이의 최대화 순차 접근에 대해 비효율적 관련된 정보를 가진 B-트리는 한 원소는 키, 다른 한 원소는 관련된 정보 B+-트리 모든 키와 레코드 정보가 순차 집합으로 표현 키와 레코드 정보는 트리 부분인 상위 레벨에 존재하지 않음 인덱스 집합은 순차 집합의 경계를 나타내는 분리자를 포함 순차 집합이 키 순서에 의해 레코드에 접근하는 순차적인 방법 제공 단순 전위 B+-트리 B+-트리에 비해 인덱스 내에 많은 키를 갖게 되므로, 트리를 얕게 구성 반드시 가변길이 필드를 지원하는 인덱스 집합 블럭을 이용