2018/05/17 - [방송통신대학교/컴퓨터과학과 [3학년 1학기]] - [데이터베이스] 6강 정규형의 적용

2018/05/15 - [방송통신대학교/컴퓨터과학과 [3학년 1학기]] - [데이터베이스] 5강 정규화 기초

2018/03/21 - [방송통신대학교/컴퓨터과학과 [3학년 1학기]] - [데이터베이스] 4강 데이터베이스 언어

2018/03/19 - [방송통신대학교/컴퓨터과학과 [3학년 1학기]] - [데이터베이스] 3강 관계형 모델

2018/03/16 - [방송통신대학교/컴퓨터과학과 [3학년 1학기]] - [데이터베이스] 2강 데이터베이스 모델링

2018/03/16 - [방송통신대학교/컴퓨터과학과 [3학년 1학기]] - [데이터베이스] 1강 데이터베이스의 이해

 

DBMS가 내부적으로 데이터를 어떻게 저장하는지 알아보도록 하자

1. 파일 구성

1) 물리적 저장장치

물리적 저장장치는 데이터 접근 속도, 용량을 기준으로 다양한 장치로 구성

레지스터 → 캐시 → 메인메모리 → 자기디스크, 플레시메모리 → 광학 디스크, 자기테이프

◀◀◀◀◀◀◀◀◀속도, 가격                                   저장용량▶▶▶▶▶▶▶▶▶▶▶

2) 저장장치별 특징

휘발성
- 캐시: 고비용 저장장치로 빠른 접근 속도를 보장
- 메인메모리: 실제 프로그램과 데이터 적재 공간
- 플래쉬 메모리: 메인메모리와 유사하나 비휘발성

비휘발성
- 자기디스크: 데이터베이스 전체를 안정적으로 저장 (비휘발성 중 가장 빠름)
- 광학 디스크 드라이브: CD, DVD, Blue-ray 등
- 테이프 장치: 용량이 크고 저렴하나 순차 접근 방식으로 접근 속도가 매우 느림

3) 데이터베이스 구성

데이터베이스는 여러 개 의 파일로 구성되어있다. 사용자가 보았을때 DBMS만 보이지만 DBMS는 여러 개 의 파일로 관리하고 있다.
각각의 파일은 여러 개 의 블록으로 나누어 저장 된다.
블록 내에서는 여러 개의 레코드가 저장되어있다.

DB > 파일 > 블록 > 레코드

파일: 데이터를 영구적으로 저장하기 위해 사용되는 가장 기초적인 구조
블록: 파일을 고정적인 길이로 분할하여 생기는 균등한 크기의 데이터 묶음
레코드: 블록을 구성하는 요소, 더 이상 분리될 수 없는 최소 데이터 저장 단위

4) 고정 길이 레코드

고정적인 바이트 수를 갖는 레코드를 저장하는 기법
고정길이일 경우 레코드의 컬럼 데이터타입 크기만큼 할당해서 블록에 저장하면 된다.

문제점:
문제점1. 레코드의 길이가 블록길이에 딱 맞춰 떨어지지않는 단점이 존재
블록의 길이가 레코드 길이로 정확히 나눠지지 않아 남은 공간을 비워두는 방법 => 블록내의 남는 공간 낭비로 이어진다.
문제점2. 블록의 길이가 레코드 길이로 정확히 나눠지지 않아 한 레코드를 두 블럭에 나누어 저장하는 방법 => 레코드 접근 시 두 블록을 접근 (시스템에서는 두 블럭에 접근해야 하므로 부하가 늘어난다.)

문제점 1 , 2 두 가지 방법 모두 무엇이 더 낫고 더 나쁜지 비교할 수 없다. 혼용해서 적절하게 사용해야 한다.

레코드 삭제 시 문제
- 해당 레코드가 저장된 위치에 빈공간이 생성
- 장시간 레코드의 삽입 및 삭제 발생 시, 저장 공간에 많은 낭비가 발생

레코드 삭제 시 대처 방안
- 마지막 레코드로 공백 대체
- 삭제 리코드 이후의 레코드를 이동
- 가용 리스트 관리

5) 레코드 삭제 대처

5-1) 마지막 레코드로 공백 대체

이름이 장보고인 레코드가 삭제되었다면 맨 마지막 이름이 안창호인 레코드를 삭제된 레코드 위치에 위치시키는 방법
항상 마지막 블럭의 위치를 알고있어야하며 빈 공간을 삭제 후 마지막 공간까지 가서 끄집어 올려야 하므로 상당한 비용이 발생하는 방법

5-2) 삭제 레코드 이후의 레코드를 이동

이름이 장보고인 레코드가 삭제되었다면 이름이 나철수인 레코드부터 마지막 레코드까지의 위치를 한단계씩 위로 끄집어 올리는 방법
삽입되는 순서를 그대로 유지시킬 수 있는 장점이 있다. (검색을 빠르게 유지 가능)
나철수 부터 맨 마지막 레코드까지 한 단계씩 올려야 하므로 어마어마한 비용이 소요되는 단점이 존재.

5-3) 가용 리스트 관리

공백 레코드 포인터를 관리하는 방법.
삭제되는 레코드의 위치들을 공백 레코드가 관리하므로써 새로 삽입되는 레코드를 공백 레코드 포인터가 가지고있는 공백의 위치에 저장시키는 방법이다.
첫번째 방법을 개선시킨 방법이다.
하지만 단점인 레코드의 순서가 뒤죽박죽이 되는건 어쩔 수 없는 단점으로 존재한다.

6) 가변 길이 레코드(varchar)

블록에 저장되는 레코드의 길이가 서로 다른(가변적) 레코드를 할당하는 방법

가변 길이 레코드가 사용되는 상황
- 한 블록 내에 저장되는 레코드 유형이 둘 이상
- 길이가 고정되지 않은 컬럼의 개수가 하나 이상
- 레코드가 멀티셋을 허용한 컬럼을 가질 때

멀티셋
레코드의 컬럼값이 여러 개인 컬럼

가변 길이 레코드 형식
어디가 끝인지를 항상 기억하고 있어야된다는게 고정길이와의 차이점이다.

고정길이 레코드 먼저 블록의 첫번째에 채우기 시작하는데 처음 0~4바이트까지는 어디서부터 얼마만큼이 가변길이인지 정보를 저장해놓는 용도로 사용한다. 4바이트부터 고정길이 데이터를 채우기 시작해서 레코드의 컬럼에 고정길이 데이터가 저장이 끝나면 한 바이트에 NULL 을 입력하여 가변바이트의 시작을 구분한다.

6-1) 슬롯페이지 구조

7) 파일 구조화 방법

하나의 블록 내부에 레코드를 어떤방식으로 저장하는거였다면 지금부턴 각각의 레코드가 하나의 파일 내부에 몇번째 블록에 들어가야하는지 이다.

파일 구조화
- 파일 수준에서 레코드를 관리(순서 등)하는 기법

파일 구조화 방법의 종류
- 힙 파일 구조: 저장순서 고려없이 레코드를 파일 내 임의의 위치에 배치
(메모리)
- 순차 파일 구조: 레코드들이 특정 컬럼값을 기준으로 정렬되어 저장
(특정 컬럼값을 기준으로 계속 순서대로 저장, 검색에는 굉장히 빠름. 저장하는데는 최악 중간에 예상치 못한 순서의 레코드가 들어오면 순서를 맞추기 위해 재정렬하는 비용이 소요.)
- 해시 파일 구조: 레코드를 입력 받아 레코드가 저장 될 블록 주소를 반환하는 해시 함수를 사용
(해시 함수를 사용해서 레코드를 저장, 찾는데 삽입되는데 해시함수를 거쳐야 하기 때문에 비용이 소요되지만 힙과 순차의 중간정도의 파일 구조화 방법이다.)

7-1) 순차 파일 구조의 예
레코드가 검색키 순서대로 정렬
레코드가 파일에 삽입되는 시점에서 키 값이 부여
장점
- 검색키에 대한 정렬 연산이 불필요, 키 값들의 순서로 레코드를 판독하는 연산에 효율적
- 현재 레코드에서 정렬된 키 순서로 다음 레코드를 찾을 때 부가적인 블록 접근이 불필요
- 이진 탐색을 사용하면 더 빠르게 레코드를 검색
단점
- 레코드 삽입, 삭제에 많은 비용 소요

7-2) 다중 테이블 클러스터링 파일 구조
빈번히 조인되는 테이블을 하나의 파일에 저장하기 위한 구조
필요한 테이블이 미리 조인되어 저장

 

2. 저장장치 접근

파일은 논리적 관점에서의 저장 객체

실제 저장될 때에는 여러 개의 물리적 단위인 블록으로 저장
- 블록은 데이터의 전송 단위
- 일반적으로 2KB ~ 32KB 사용
- 블록 전송을 최소화 할 수록 입출력 소요 시간이 단축

> 사용 중인 블록을 지속적으로 메모리에 적재
> 한정적 공간으로 인하여 필요에 따라 특정 블록 할당 해지
> 메모리 내부에 버퍼라는 공간에 블록을 저장하고, 이를 관리하기 위한 버퍼 관리자를 사용

1) 버퍼 관리자

DBMS상의 소프트웨어는 필요한 블록이 있을 때 버퍼관리자에게 해당 블록을 요청
- 요청된 블록이 버퍼에 있다면, 버퍼 관리자는 블록이 위치한 메모리 주소를 프로그램에게 전달
- 요청된 블록이 없는 경우, 버퍼 관리자는 버퍼내의 새로운 공간을 할당하고 해당 블록을 적재
- 더 이상 적재할 공간이 없다면, 버퍼에 있는 기존 블록을 선택하여 할당을 해지하고 해당 블록을 적재

2) 버퍼 관리자의 기능

버퍼 교체 전략
- 가용 공간을 확보 하기 위해 기존에 적재된 블록의 할당을 특정 기준에 의하여 해지
- 미래에 가장 적게 사용될 블록을 선택하여 디스크로 내보내는 것이 이상적인 버퍼 교체 전략
- 버퍼 교체 전략 기법
> LRU(Least Recently Used): 최근에 가장 적게 참조한 블럭을 교체
> MFU(Most Frequently Used): 특정 기간동안 가장 여러 번 사용된 블록을 선택하여 블록을 교체

고정 블록
- 장애로 인하여 메모리의 데이터가 손실되어 작업이 중단될 경우, 중단된 작업의 결과물이 디스크에 기록되는 것을 방지
- 디스크 블록이 교체되는 것을 제한

블록 강제 출력
- 시스템 로그와 같이 중요한 데이터는 디스크에 영구적으로 기록되어야 함
- 버퍼 공간이 필요 없어도 강제로 디스크에 기록