페이지 구조
-
페이지에는 페이지 헤더가 있는데 페이지에 대한 메타 정보를 담고 있다.
-
레코드의 숫자, 남은 공간, 다음 또는 이전 페이지에 대한 포인터, 비트맵 그리고 슬롯 테이블을 가지고 있다.
-
페이지에 레이아웃은 두 가지 관점이 있는데 첫번째로 페이지 안에 저장될 레코드의 형태가 고정 길이를 가지는 경우와 가변 길이를 가지는 경우가 있다. 두 번째는 페이지가 패킹 되거나 언패킹 되는 경우가 있다.
-
페이지에서 레코드는 레코드 아이디를 통해서 찾을 수 있으며 레코드 아이디는 다음과 같은 형태로 저장이 된다. (페이지 번호, 페이지에서 찾으려는 레코드 아이디) 이와 같은 형태로 저장이 되므로 어떤 페이지에 레코드가 어디에 위치해있는지를 찾을 수 있다.
고정 길이 레코드, 패킹 된 경우 페이지 레이아웃
-
이런 구조인 경우 레코드를 추가할 때 빈 공간을 찾기 쉽다. 우선 페이지 헤더로 가서, 레코드의 숫자를 확인한 다음에 마지막 레코드로 가서 레코드를 추가하면 된다.
-
하지만 삭제의 경우에는 삭제하고 나서, 삭제된 레코드 공간을 땡겨야 한다. 맨 끝에 레코드를 삭제하는 경우에는 아무것도 하지 않아도 되지만, 중간 레코드를 삭제 했다면 삭제된 레코드의 공간을 뒤의 레코드부터 땡겨서 앞으로 채워야 한다.
-
그리고 레코드 아이디 또한 변경되게 된다. 따라서 페이지안의 레코드가 변경 되는 경우 연산이 많아 진다.
고정 길이 레코드, 언패킹
-
이 구조의 경우 페이지 해더에 비트맵 정보가 포함된다. 이 비트맵 정보를 참조해서 레코드가 비어있는지 아니면 비어있지 않은지 확인할 수 있다.
-
데이터를 추가할 경우에는 페이지 헤더에서 비어있는 레코드를 확인할 수 있는 비트맵을 참고하여 가장 먼저 비어있는 페이지를 데이터를 추가하면 된다.
-
삭제하는 경우에는 그냥 간단하게 비트맵에 해당 레코드 위치의 비트를 삭제되었다고 바꾸면 된다. 언패킹 구조의 경우에 추가 및 삭제가 비트 연산을 통해서 이루어지므로, 매우 빠르다.
가변 길이 레코드
-
가변 길이 레코드의 경우, 페이지 맨 아래 부분에 슬롯 디렉터리를 가진다. 이를 푸터라고 부른다.
-
맨 마지막 슬롯은 비어있는 레코드의 위치를 나타낸다. 따라서 항상 맨 마지막 레코드의 끝을 가리키고 있다고 생각하면 된다.
-
그리고 각 슬롯은 레코드의 위치와 길이를 가지고 있다.
-
페이지에서 레코드를 삭제하는 방법은 더 간단하다. 슬롯에서 해당 레코드를 가리키고 있는 슬롯을 지우면 된다.
-
페이지에서 새로운 레코드를 더하는 것은 빈 슬롯을 찾아서 거기에 새로 추가될 레코드의 주소를 가리키면 된다.
-
그렇다면 메모리 단편화에 대해서 생각을 해봐야할 것이다. 메모리 단편화를 위해서 빈 메모리 공간을 정리해줄 필요가 있는데 두가지 방식이 있다. 레코드가 업데이트 될 때마다 정리를 해주는 방식과 실제 단편화 때문에 데이터를 넣기 힘들 때 정리를 하는 방식이 있다. 보통 후자를 사용한다.
레코드 구조
-
관계형 모델에서, 테이블에 대한 정보 및 테이블이 가지고 있는 컬럼 및 자료형은 시스템 카탈로그에 저장된다. 그 이유는 레코드에서 타입을 구분하기 위한 노력을 하지 않아도 되므로 저장공간을 더 많이 확보할 수 있다.
-
따라서 레코드는 저장하는 데이터에 대한 어떠한 정보도 가지고 있지 않으며 테이블 정보는 시스템 카탈로그에 저장된다.
-
따라서 레코드에서 필드 타입은 구분되지 않는다. 또한 자바와 같이 직렬화를 하지 않으며 데이터베이스에 저장된 바이트 형태 그대로 메모리에서 보여지게 된다.
-
따라서 각 필드를 어떻게 구분할지에 대한 문제가 생기게 된다. 간단하게 생각하면 CSV 파일 처럼, 구분자를 넣어줄 수도 있지만 이는 파싱을 해야하며 또한 낭비되는 메모리가 발생한다. 각 필드마다
,
구분자를 넣어줘야하기 때문이다.
-
결론은 레코드에 해더를 생성하고 그 헤더에서 각 필드의 마지막 위치를 가리키는 것이다.
-
가변 길이 필드는 뒤로 늘어나야 하므로, 고정 길이 필드가 앞으로 오게 되고 뒤에 이어서 가변 길이 필드가 저장된다.
참고 문헌
>> Home