제 23장 Multimedia DBMS
Download
Report
Transcript 제 23장 Multimedia DBMS
7장 인덱스된
순차 화일
© DBLAB, SNU
인덱스된 순차 화일의 구조
인덱스된 순차 화일(indexed sequential file)은
순차 데이타 화일(sequential data file)과 인덱스(index)로 구성
순차 데이타 화일
– 키 값에 따라 레코드들이 순차적으로 정렬
– 레코드 전체에 대한 순차 접근을 지원
인덱스 화일
– 화일의 레코드들에 대한 키 값과 포인터를 저장
– 개별 레코드에 대한 직접 접근을 지원
각 화일은 블록(block)으로 구성
– 인덱스 화일
인덱스 블록(index block)으로 구성
트리 구조를 형성
– 순차 데이타 화일
데이타 블록(data block)으로 구성
데이타 블록들은 연결 리스트로 논리적 순서를 유지
– 블록은 순차적으로 저장된 키 값과 자유 공간을 포함
© DBLAB, SNU
2
인덱스된 순차 화일의 구조
© DBLAB, SNU
3
인덱스된 순차 화일의 구조
마스터 인덱스(master index)
– 인덱스 트리의 최상위 레벨 인덱스 블록
인덱스 엔트리의 구성
– <최대 키 값, 포인터>
– 포인터는 해당 키 값을 최대 키 값으로 갖는 다음 레벨의
인덱스 블록이나 데이타 블록에 대한 주소
자유 공간(free space)
– 레코드의 추가 삽입을 위한 예비 공간
– 화일 생성시 각 블록에 분산 배치
키 32에 대한 직접 검색 예
– 데이타 블록 2를 찾고 블록 내에서는 순차 탐색
© DBLAB, SNU
4
▶ 레코드 삽입(1)
삽입
전의 화일 상태
© DBLAB, SNU
5
▶ 레코드 삽입(2)
15, 8을 삽입(구조 변경 없이 순차만 유지)
© DBLAB, SNU
6
▶ 레코드 삽입(3)
17을 삽입(데이타 블록 1의 분할)
© DBLAB, SNU
7
▶ 레코드 삽입(4)
9, 5, 6을 차례로 삽입(인덱스 블록과 데이타 블록의 분할)
© DBLAB, SNU
8
B+-트리
Knuth가 제안한 B-트리의 또 다른 변형
– 인덱스 세트(index set)와 순차 세트(sequence set)로 구성
– 순차 탐색의 성능 향상을 목적
– B-트리의 순차 탐색을 보완
인덱스 세트(index set)
– 리프 이외의 노드로 구성
– 키 값만 저장
– 리프 노드를 접근하는 경로로만 이용
순차 세트(sequence set)
– 리프 노드들로 구성
– 실제 모든 <키 값, 데이타 레코드의 주소>들이 저장
– 키 값의 순서에 따라 모든 레코드를 순차 접근하는데 이용
© DBLAB, SNU
9
▶ 3차 B+- 트리의 예
© DBLAB, SNU
10
▶ m차 B+- 트리의 특성 (1)
① 노드 구조
<n, P0, K1, P1, K2, P2, … , Pn-1, Kn, Pn>
– n : 키 값의 수, 1≤n<m이다.
– P0, …, Pn : 서브트리에 대한 포인터
– K1, …, Kn : 키 값
② 루트는 0이거나 2에서 m개 사이의 서브트리를 가짐
③ 루트와 리프를 제외한 모든 내부 노드는 최소 ⌈m/2⌉개,
최대 m개의 서브트리를 가짐.
④ 리프가 아닌 노드에 있는 키 값의 수는 그 노드의
서브트리 수보다 하나 적음.
⑤ 모든 리프 노드는 같은 레벨
© DBLAB, SNU
11
▶ m차 B+-트리의 특성 (2)
⑥ 한 노드 안에 있는 키 값들은 오름차순으로 정렬
(1≤i≤n-1에 대해 Ki<Ki+1)
⑦ Pi, (0≤i≤n-1)가 지시하는 서브트리에 있는 노드들의 모든 키
값들은 키 값 Ki+1보다 작거나 같음(≤)
⑧ Pn이 지시하는 서브트리에 있는 노드들의 모든 키 값은 키 값
Kn보다 큼
⑨ 리프 노드는 화일 레코드들의 순차 세트를 나타내며 모두 링크로
연결되어 있음
⑩ 리프 노드의 구조
<q, <K1, A1>, <K2, A2>, … , <Kq, Aq>, Pnext>
– Ai : 키 값 Ki를 저장하고 있는 레코드에 대한 포인터
– ⌈m/2⌉≤ q
– Pnext : 다음 리프 노드에 대한 링크
© DBLAB, SNU
12
▶ B+-트리와 B-트리의 차이
인덱스 세트와 순차 세트의 구분이 있으며 구조가 다름
– 인덱스 세트는 리프 노드에 있는 키 값을 찾는 경로로만
이용(키 값만 저장)
인덱스 세트에 있는 키 값은 순차 세트에 다시 나타남
– 순차 세트는 실제 데이타 레코드를 찾는 데 이용(키 값과
그 키 값을 가진 레코드에 대한 포인터가 저장)
– 인덱스 세트의 노드와 순차 세트의 노드에 들어갈 수 있는
키의 개수가 다름 (∵구조가 다름)
– 순차 세트의 모든 노드는 링크로 연결
화일 레코드의 순차 접근이 효율적
© DBLAB, SNU
13
▶ B+-트리에서 키 값의 삽입
B-트리의 리프 노드에 삽입하는 것과 유사
– 다만 노드가 오버플로 되어 분할 시 중간 키 값(분할된
왼쪽 노드에서 제일 큰 키 값)이 부모 인덱스 노드로
올라가 저장될 뿐만 아니라 분할된 노드에도 저장.
분할 생성된 리프 노드는 순차 세트의 연결 리스트에
순차성이 유지되도록 적절히 링크로 연결
– 인덱스 노드 분할 시에는 B-트리와 똑같은 알고리즘을
수행하고, 중간 키 값이 부모 노드로 올라감
© DBLAB, SNU
14
▶ 삽입 예(1)
초기 리프 노드에 키 값 15, 69, 110 삽입(인덱스 세트가 공백)
키 값 90의 삽입(리프 노드의 분할)
© DBLAB, SNU
15
▶ 삽입 예(2)
키 값 20, 120의 삽입(트리 구조에 영향이 없음)
키 값 40의 삽입(리프 노드의 분할)
© DBLAB, SNU
16
▶ 삽입 예(3)
키 값 125의 삽입(리프 노드와 인덱스 노드의 분할, 트리의 높이를
증가)
© DBLAB, SNU
17
▶ B+-트리에서 키 값의 삭제
B-트리와 유사
– 다만 재분배(redistribution)나 합병(merge)을 요하지 않는
키 값의 삭제는 리프 노드에서만 수행
– 인덱스 세트에 키 값이 나타나 있는 경우에도 실제로
삭제는 하지 않고 분리자(separator)로 이용(다른 키 값을
탐색할 때 분리 키로 이용)
© DBLAB, SNU
18
▶ 삭제 예(1)
삭제 전 B+-트리
© DBLAB, SNU
19
▶ 삭제 예(2)
키 값 43의 삭제(인덱스 세트의 43은 분리 키로 유지)
키 값 125의 삭제(언더플로로 재분배 유발)
© DBLAB, SNU
20
▶ 삭제 예(3)
키 값 55의 삭제(언더플로로 합병, 인덱스의 키 값도 삭제)
© DBLAB, SNU
21
▶ B+-트리의 성능 (B-트리와 비교)
키 값의 직접 검색
– 검색은 항상 리프 노드(순차 세트)까지 내려가야만 종료
검색하고자 하는 키 값이 인덱스 세트에서 발견되더라도 리프
노드까지 내려가야만 실제 레코드의 주소를 알 수 있음
키 값이 인덱스 세트에서 발견되더라도 레코드가 반드시 있다는 것은
아님
같은 수의 키 값을 가지고 있는 B-트리에 비해 B+- 트리는 레벨이
낮아질 수 있음
– 인덱스 노드는 레코드 포인터를 저장하지 않으므로 노드 내
공간이 절약됨 → 트리 레벨이 낮아질 수 있음
순차 검색
– 연결 리스트를 순회 → B-트리에 비해 효율적
B+-트리는 직접 처리와 순차 처리를 모두 필요로 하는 응용에서
효율적
© DBLAB, SNU
22
VSAM 화일
VSAM : Virtual Storage Access Method
B+-트리 인덱스 구조 기법을 이용하는 대표적인 인덱스된
순차 화일 구성 방법
VSAM 화일의 구조
– 제어 구간(control interval)
데이타 레코드 저장을 위한 공간 단위
– 제어 구역(control area)
일정 수의 제어 구간으로 구성된 공간 단위
– 순차 세트(sequence set)
제어 구역에 대한 인덱스를 저장하는 인덱스 공간
– 인덱스 세트(index set)
순차 세트에 대한 상위 인덱스
다 단계로 구성
© DBLAB, SNU
23
(1) VSAM 화일 구조
레벨 3
...
인덱스
세트
레벨 2
...
. . . . . .. . . . . . ..
순차
세트
제어
구간
1
2
3
4
5
6
7
.
제어구역 1
...
레벨 1
. . . . . ..
...
제어구역 2
제어구역 n-1
자유공간
© DBLAB, SNU
24
▶ 제어 구간
제어 구간(control interval)
– 하나 이상의 레코드를 저장할 수 있는 데이타 블록(data block)으로
구성
– 추가 레코드 삽입을 위해 자유 공간(free space)을 유지
– 레코드는 키 값에 따라 물리적 순차로 저장되고 유지
– 제어 정보(control information)를 포함
레코드에 대한 제어 정보와 자유 공간에 대한 제어 정보
제어 구간 뒤쪽부터 저장됨
– 제어 구간의 구조
레코드 1
레코드 2
레코드 5
레코드 6
자유 공간
© DBLAB, SNU
레코드 3
레코드 4
자유 공간
레코드
제어정보
자유공간
제어정보
25
▶ 제어 구역, 순차 세트
제어 구역(control area)
– 일정 수의 제어 구간으로 구성
– 제어 구간의 오버플로를 처리하기 위하여 제어 구역 내에
제어 구간을 자유 공간으로 예비
화일 생성시 보통 제어 구역의 마지막 제어 구간
순차 세트(sequence set)
– 순차 블록(sequence block)으로 구성되고 하나의 순차 블록은 하나의
제어 구역에 1:1로 대응
– 순차 블록의 각 엔트리는 그 제어 구역에 속하는 제어 구간과 1:1로
대응
– 순차 블록의 엔트리는 <제어 구간의 최대 키 값, 포인터>로 구성되고
키 값 순으로 저장
– 제어 구역에 속하는 제어 구간들의 논리적 순서는 순차(물리적
순서)가 아니라 순차 블록의 엔트리 순서에 의해 유지
– 순차 세트 내에서의 순차 블록들은 제어 구역을 순차로 유지할 수
있도록 체인으로 연결
순차 접근이 용이
© DBLAB, SNU
26
▶ 인덱스 세트
인덱스 세트(index set)
– 인덱스 블록(index block)들로 구성된 m-원 탐색 트리 구조
– 인덱스 블록의 엔트리는 <차 하위 레벨의 인덱스 블록의
최대 키 값, 포인터>로 구성
– 최 하위 레벨의 인덱스 블록 엔트리들은 각각 하나의
순차 블록을 가리킴
– 하나의 순차 블록 내에서는 엔트리들이 키 값의 크기
순으로 저장되기 때문에 결과적으로 화일 전체가 키
순차로 저장됨
© DBLAB, SNU
27
(2) VSAM 화일에서의 연산
키 순차 화일(key-sequenced file)을 지원
– 레코드들을 키 값 순으로 저장하고 유지
제어 구간 내에서 레코드들은 키 값 순으로 물리적으로 저장
제어 구역에 속한 제어 구간들의 키 값 순서는 순차 세트의
순차 블록 엔트리로 유지
순차 세트의 순차 블록 순서는 최 하위 레벨의 인덱스 블록으로
순차를 유지
– 화일을 생성할 때 자유 공간(free space)을 분산 배치
제어 구간 내에 자유 공간 할당
제어 구역 내에 자유 제어 구간을 할당
순차 접근
직접 접근
– 인덱스 세트를 탐색하여 첫 번째 제어 구역에 대한 순차 세트의 첫
번째 순차 블록을 식별
– 연결된 순차 세트의 순차 블록들을 체인으로 따라가며 차례로 모든
제어 구간을 접근
– B+-트리와 유사
– 레코드 접근을 위해서는 인덱스 세트, 순차 세트, 제어 구간 순으로
접근
© DBLAB, SNU
28
▶ VSAM 화일에서의 레코드의 삽입
레코드 삽입
– 해당 제어 구간을 식별하고 레코드를 삽입
– 삽입되는 레코드의 순차를 유지하기 위하여 제어 구간 내
레코드들을 이동
제어 구간이 만원이 되어 레코드를 삽입할 자유 공간이
없을 때는 제어 구간을 분할(control interval split)
– 제어 구역 내의 자유 제어 구간으로 레코드를 절반 이동
순차 블록의 엔트리들을 조정하여 제어 구간의 순서를 유지
제어 구역이 만원이 되어 자유 제어구간이 없을 때는
제어 구역을 분할(control area split)
– 화일의 자유 제어구역으로 레코드 절반을 이동
– 순차 세트 체인을 조정해서 제어 구역 순서를 유지
© DBLAB, SNU
29
▶ VSAM 화일에서의 삽입 예(1)
레코드 삽입 전의 VSAM 화일
{
125
199
250
293
인덱스
세트
순차
세트
제어
구간
{
65
88
102
125
140
155
172
199
55
60
65
FS
75
83
88
FS
51
56
61
72
78
85
53
57
65
73
80
86
55
60
75
83
88
제어 구역 1
© DBLAB, SNU
...
제어구역
구역 21
제어
30
▶ VSAM 화일에서의 삽입 예(2)
키가 52인 레코드가 삽입된 뒤의 제어 구역 1
55
60
65
51
56
61
52
57
65
53
60
FS
55
제어 구역 1
© DBLAB, SNU
31
▶ VSAM 화일에서의 삽입 예(3)
키가 54인 레코드가 삽입되어 제어 구간 분할이 일어난
뒤의 제어 구역 1
52
55
60
65
51
56
61
53
52
57
65
54
60
55
제어 구역 1
© DBLAB, SNU
32
▶ VSAM 화일에서의 레코드의 삭제
레코드 삭제
– 해당 레코드를 식별하고 물리적으로 삭제
– 나머지 레코드들의 순차를 유지하기 위하여 제어 구간 내
레코드들을 이동
– 만일 제어 구간의 최대 키 값을 삭제할 때는 이
제어 구간에 대한 순차 블록 엔트리의 키 값을 조정
– 만일 제어 구역의 최대 키 값을 삭제할 때는 이 제어
구간에 대한 순차 블록 엔트리의 키 값뿐만 아니라
인덱스 세트의 엔트리도 조정
© DBLAB, SNU
33
ISAM 화일
인덱스된 순차 화일을 저장장치의 물리적 특성(실린더와
트랙)을 기반으로 구현하는 방법
IBM의 ISAM(Indexed Sequential Access Method)
인덱스 화일과 데이타 화일로 구성
– 인덱스 화일(index file)은
마스터 인덱스(master index),
실린더 인덱스(cylinder index),
트랙 인덱스(track index)로 구성
– 데이타 화일(data file)은
기본 데이타 구역(prime data area)과
오버플로 구역(overflow area)으로 구성
© DBLAB, SNU
34
(1) ISAM 화일의 구조
ISAM 화일의 예
–
–
–
–
기본 데이타 구역은 6개의 실린더로 구성
실린더당 4 트랙(한 트랙은 오버플로 구역)
트랙당 5개의 레코드 수용
트랙당 40%의 자유 공간
© DBLAB, SNU
35
▶ ISAM 화일의 인덱스 구조
트랙 인덱스(track index)
– 실린더 내에 실제 데이타 레코드들이 저장되어 있는
트랙에 대한 인덱스
– 각 실린더의 첫 번째 트랙(트랙 0)에 저장되어 있음
– 각 엔트리는 <최소 키 값, 트랙 번호> 로 구성
실린더 인덱스(cylinder index)
– 데이타가 저장되어 있는 기본 데이타 구역(prime data area)
즉 실린더에 대한 포인터를 가짐
– 각 엔트리는 <최대 키 값, 실린더 번호> 로 구성
마스터 인덱스(master index)
– 최상위 레벨의 인덱스
– 각 엔트리는 <최대 키 값, 포인터> 로 구성
포인터는 해당 키 값을 가진 실린더 인덱스 엔트리를 가리킴
– 화일 처리 시 메모리에 상주
© DBLAB, SNU
36
▶ ISAM 화일에서의 레코드 삽입(1)
레코드 검색 과정을 통해 삽입해야 될 데이타 트랙을
결정
트랙에서는 키 값의 오름차 순이 유지되도록 레코드를
삽입
트랙이 만원인 경우에는
– 오버플로 구역(트랙)을 사용
– 트랙 인덱스에 오버플로 인덱스를 추가
<키 값, 오버플로 포인터(op)>
– 오버플로 구역에서 레코드는 삽입 순서로 저장되고
체인으로 키 값 순서를 유지
– 오버플로 레코드 형식
<레코드, 같은 트랙의 다음 오버플로 레코드에 대한 포인터>
© DBLAB, SNU
37
▶ ISAM 화일에서의 레코드 삽입(2)
삽입 전의 ISAM 화일
© DBLAB, SNU
38
▶ ISAM 화일에서의 레코드 삽입(3)
레코드 15와 7을 삽입
레코드 17을 삽입(트랙 1에 오버플로 발생, 오버플로 인덱스 추가)
© DBLAB, SNU
39
▶ ISAM 화일에서의 레코드 삽입(4)
레코드 12를 삽입(트랙 1에 오버플로 발생, 레코드 체인 형성)
레코드 추가 삽입이 많은 경우
– 독립된 실린더 오버플로 구역을 예비
– 오버플로 체인이 길어져 성능 저하 → 주기적인 화일
재구성 필요
© DBLAB, SNU
40
▶ ISAM 화일에서의 레코드 삭제(1)
방법 1 : 삭제할 레코드를 물리적으로 삭제
– 삭제할 레코드가 기본 데이타 구역에 있는 경우
삭제할 레코드 뒤에 있는 레코드들을 한 자리씩 왼쪽으로 이동
필요한 경우 오버플로 트랙의 레코드를 기본 구역으로 이동하고
오버플로 인덱스 엔트리를 조정
– 삭제할 레코드가 오버플로 구역에 있는 경우
연결 리스트를 적절히 조정하고 체인에 대한 오버플로 인덱스
엔트리를 조정
방법 2 : 삭제할 레코드를 물리적으로 삭제하지 않고 삭제
표시만 함
– 검색 시에 삭제 표시된 레코드는 생략
– 일정한 주기로 삭제 표시된 레코드를 정리해야 됨
– 단점
공간의 낭비
불필요한 오버플로 레코드 발생
© DBLAB, SNU
41
인덱스된 순차 화일의 설계
화일 설계 시 고려 사항
① 레코드의 필드 수와 배치
② 레코드의 키 필드와 크기
- 고정길이나 가변 길이 레코드를 모두 수용할 수 있도록
- 화일에 대한 직접 접근이 용이한 키 선택
③ 예상 레코드 추가 삽입 레코드 수
- 일반적으로 약 40%의 자유 공간 할당
④ 주어진 시스템에서의 화일 구현 방법
© DBLAB, SNU
42
▶ 인덱스된 순차 화일의 구현
구현을 위한 결정 요소
① 데이타 블록의 크기
② 인덱스 블록의 크기
③ 초기 인덱스 레벨 수
④ 최대 인덱스 레벨
→ 실제 값은 시스템 본래의 블록 크기, 현재 또는 예상되는
데이타 레코드의 수, 화일의 용도 등에 따라 결정
개별 레코드에 대한 직접 검색이 주로 요구되는 응용 :
밀집 인덱스를 사용하는 것이 유리
순차 검색이 주로 요구되는 응용 : 데이타 블록을 크게
하거나 기본 구역과 블로킹 인수를 크게 하는 것이 유리
© DBLAB, SNU
43
▶ 인덱스 설계
인덱스 설계 시 가장 중요한 매개변수
– 인덱스 블록의 참조 능력 : 인덱스 분기율(fanout)
y = B / (V+P)
y : 인덱스 분기율
B : 블록 크기
V : 키 값 길이
P : 포인터 길이
(V+P) : 인덱스 엔트리 크기
인덱스 레벨 vs 인덱스 분기율
– 인덱스 분기율이 크면 → 인덱스 레벨은 낮고
→ 검색 속도는 빠름
© DBLAB, SNU
44
▶ 인덱스 설계 예
레코드 길이가 200 바이트인 레코드 100만 개를 저장하는 인덱스된
순차 화일의 설계
– 키 길이 : 14바이트
– 포인터의 크기 : 6바이트,
– 블록 크기: 2000 바이트
분석
이 설계에서 레코드 접근을 하기 위해서는 3번의 디스크 접근이
필요
–
–
–
–
–
–
–
블로킹 인수: 2000/200 = 10
필요한 데이타 블록에 대한 인덱스 엔트리: 10만개
인덱스 엔트리의 크기: 14+6 = 20
인덱스 블록의 분기율 : 2000/20 = 100
최하위 레벨(레벨1)의 인덱스 블록 수: 10만/100 = 1000
레벨 2의 인덱스 블록 수: 1000/100 = 10
레벨 2의 인덱스 블록 10개는 메모리에 상주 시키기엔 너무 크므로
레벨 3의 인덱스를 만들어야 함: 1개의 인덱스 블록(마스터 인덱스)
– 인덱스 접근 2번(마스터 인덱스는 메모리 상주) + 레코드 접근 1번
© DBLAB, SNU
45
▶ 인덱스 설계 예
© DBLAB, SNU
46