DB

[Relational database] 03. 디스크와 파일

Joo.v7 2024. 10. 3. 16:14

Chapter 1: 기억장치 계층 구조

  • 디스크와 파일 개요
  • 기억장치 계층구조 개요

Chapter 2: 디스크

  • HDD
  • SSD
  • 디스크의 성능

Chapter 3: 디스크 공간 관리 (Disk Manager)

  • 비어있는 블록의 추적 감시
  • 운영체제 파일 시스템을 이용한 디스크 공간 관리

Chapter 4: 버퍼 관리자 (Buffer Manager)

  • 버퍼 풀
  • 버퍼 교체 전략
  • 버퍼 관리 기법 비교

Chapter 5: 레코드 형식

  • 고정 길이 레코드(Fixed-length Record)
  • 가변 길이 레코드(Variable-length Record)

Chapter 6: 페이지 형식

  • 페이지 형식
  • 고정 길이 레코드
  • 가변 길이 레코드

Chapter 7: 파일과 인덱스

  • Heap 파일
  • 인덱스 개요
  • ISAM 파일
  • B+ 트리

Chapter 8: 시스템 카탈로그

  • 시스템 카탈로그

 

Chapter 1: 기억장치 계층 구조

디스크와 파일 개요

DBMS SW 구성요소.

  • DBMS는 계층화된 기억 장치로 관리되고, 각 기억 장치는 각각 독립된 구성요소들에 의해 관리된다.
  • Disk Manager: 가용한 디스크 공간을 추적 감시(요청, 반환)하는 역할.
  • File Manager: 페이지 단위로 디스크 공간을 요청하거나 반환하고, 페이지 내의 레코드들을 배치하는 역할.
  • Buffer Manager: 요청 페이지를 디스크로 부터 가져와서 Buffer Pool(주 기억장치의 한 구역)에 적재.
    -> Paging(페이징): 디스크에 있는 데이터를 메모리에 올리는 것.

 

기억장치 계층구조 개요

컴퓨터 시스템의 기억장치

  • 1차 저장장치(Primary Storage - 주 기억장치): Register, Cache, Main memory(RAM) => 휘발성
  • 2차 저장장치(Secondary Storyage): SSD, HDD
  • 3차 저장장치(Tertiary Storage): Magnetic tape

 

Chapter 2: 디스크

HDD

  • 자기(magnetic)를 이용해서 플래터에 데이터를 쓰거나 읽음. (직접 접근 방식)
  • Data는 디스크 내에서 디스크 블록(Disk Block)이라고 하는 단위로 저장.

 

SSD (Solid State Drive)

    • 플래시 메모리를 기반으로 한 저장 매체로, Random Access 가능한 빠른 속도의 저장 장치.

 

디스크의 성능

  • HDD
    • DBMS가 작업을 수행하려면 data는 Main memory에 있어야 함.
    • disk와 Main memory 간의 데이터 전송 단위는 block 이므로, block 내 하나만 필요해도 block 전체 데이터가 전송됨.
    • block과 page의 I/O는 데이터 위치에 좌우됨 (접근시간 = 탐색시간 + 회전 지연 시간 + 전송 시간)
  • SSD
    • 전송 시간만 소요되므로 random access에서도 일정한 응답 속도가 보장됨.

 


Chapter 3: 디스크 공간 관리 (Disk Manager)

 * DBMS SW의 구성요소 가장 아래의 Disk Manager는 데이터의 단위로 page라는 개념을 지원하고, 페이지를 할당/반환/판독/기록함.

비어있는 블록의 추적 감시

  • DBMS는 사용중인 디스크 블록과, 어떤 페이지에 어느 디스크 블록이 있는지를 추적 감시함.
  • 추적 감시 방법으로, (1) 비어있는 블록들의 리스트를 유지함. (2) 디스크 블록마다 1bit씩 블록의 사용 여부를 나타내는 비트맵 사용.

 

운영체제 파일 시스템을 이용한 디스크 공간 관리

  • OS는 디스크 공간을 관리한다. DBMS는 OS의 파일 시스템을 바탕으로 DB를 관리하기도 한다.
  • 대부분의 DBMS는 OS의 파일 시스템에 의존하지 않는다. -> 특정 OS에 맞추면 다른 OS에서 동작하는 DBMS 만들기 어려움.

 

* DB 확장하는 2가지 방법

2024.10.03 - [NHN Java 백엔드 8기/Relational database] - [Relational database] DB를 확장하는 2가지 방법

 

[Relational database] DB를 확장하는 2가지 방법

1. Scale Up (스케일 업)서버의 용량을 늘리는 것.2. Scale Out (스케일 아웃)서버를 추가하는 것.문제: 각 서버에 저장된 데이터가 달라서 request를 처리해야 하는데 해당 서버에 데이터가 없을 수 있다.

lightningtech.tistory.com

 

 


Chapter 4: 버퍼 관리자 (Buffer Manager)

 * 대부분의 DB는 Main memory보다 용량이 크다, CPU는 memory에 적재된 data만 처리할 수 있으므로 DBMS는 필요할 때 마다 data를 Main memory에 적재해야 함. 따라서 Buffer Manager는 disk로부터 page를 가져와서 Main memory(버퍼 풀)에 적재함.

버퍼 풀

  • Buffer Manager는 필요할 때 마다 disk로부터 page를 가져와서 buffer pool에 적재한다. -> Paging
  • Buffer Pool: 가용한 Main memory 공간을 page라는 단위로 분할한 데이터 적재 공간.
  • Frame: page(record들의 집합)를 담을 수 있는 슬롯.

Buffer Pool (버퍼 풀)

 

버퍼 교체 전략

  • LRU (Least Recently Used): 가장 최근에 사용한 페이지를 교체하는 전략.
  • Closk: LRU의 변형으로, 1 ~ N 사이의 값을 가지는 current 변수를 사용하여 교체용 페이지를 선정.
  • 그 외 방식들 - FIFO, MRU, Random ...

 

버퍼 관리 기법 비교

  • OS의 Virtual memoryDBMS의 Buffer manager는 비슷하다.
목적 데이터베이스 성능 최적화, 디스크 I/O 최소화 메모리 확장 및 프로그램 보호
관리 단위 데이터베이스 페이지 (레코드나 인덱스) 페이지 (일반적인 메모리 블록)
동작 방식 자주 사용하는 데이터 캐싱, DBMS 특화된 관리 가상 주소와 물리적 주소 매핑, 메모리 확장
캐싱 정책 DBMS의 특성에 맞춘 캐시 교체 정책 사용 일반적인 메모리 접근 패턴 기반 교체 정책
데이터 이해 데이터베이스 구조와 쿼리 실행을 이해하고 최적화 프로그램의 메모리 접근 패턴만 인식

 

* OS의 Virtual memory

2024.10.03 - [CS] - [CS] OS - 가상 메모리 (Virtual Memory)

 

[CS] OS - 가상 메모리 (Virtual Memory)

1. 가상 메모리 (Virtual Memory) 프로그램이 실행될 때, 실행에 필요한 일부분만 주 기억장치(Main memory)에 load. 2. 가상 메모리 기법 2가지 Paging (페이징): Process를 Page라고 하는 고정된 크기로 분할해

lightningtech.tistory.com

 


Chapter 5: 레코드 형식

 * Buffer pool에 있는 page 내의 data는 record라는 형식으로 구성된다.

고정 길이 레코드 (Fixed-length Record)

  • 각 Length of Field와 Field의 수가 고정된 레코드 형식.
  • Field를 record에 연속적으로 저장.
  • 빠르지만 메모리 공간이 낭비될 수 있다.

고정 길이 레코드 (Fixed-length Record)

 

가변 길이 레코드 (Variable-length Record)

  • 각 Length of Field가 가변적인 경우, 해당 레코드의 길이가 가변적이게 된다.
  • (1) Field를 구분자($)로 구분하여 연속적으로 저장. (2) 레코드의 앞 부분에 정수로 된 offset들을 배열로 저장.
  • 느리지만 메모리 공간을 절약할 수 있다.

(1) Field를 구분자($)로 구분하여 연속적으로 저장.
(2) 레코드의 앞 부분에 정수로 된 offset들을 배열로 저장.

 


Chapter 6: 페이지 형식

페이지 형식

  • Page: record가 탑재되는 slot의 모임.
  • record는 RID(<page no>, <slot no>의 쌍)로 식별됨.
  • Paging: 

고정 길이 레코드

  • slot은 같은 형태이며, 연속적으로 배치 가능.
  • (1) record를 처음의 N slot에 순서대로 배치, (2) offset 비트맵 사용.

좌: (1), 우: (2)

 

가변 길이 레코드

  • 새 record가 삽입될 때 마다 정확한 길이의 새 slot을 찾아야 한다. (공간 낭비를 줄이기 위해)
  • 한 페이지에서 slot마다 <record offset, record length>의 형태로 slot directory 유지.
  • 각각의 offset이 record의 시작 주소를 가리킨다.

 


Chapter 7: 파일과 인덱스

 * record는 page에 저장되고, page는 file에 저장된다. page가 file에 조직되는 형태에 따라 DB의 성질과 속도가 달라진다.

Heap 파일

  • 가장 간단한 파일 구조, record가 file의 빈 공간에 순서 없이 저장.
  • 정렬되지 않은 파일 구조.

 

인덱스 개요

  • index: 테이블에서 데이터의 검색 속도를 높이기 위한 보조 자료구조.

 

ISAM 파일

  • 색인 순차 접근 방식(Indexed Sequential Access Method) 파일.
  • 데이터를 순서대로 저장하거나, 특정 항목을 sequential로 처리할 수 있는 파일 처리 방법.
  • 예전에 많이 사용한 파일 시스템으로, 현재 이를 개선한 B+트리가 많이 사용된다.

 

B+ 트리

  • ISAM의 오버 플로 단점을 개선한 동적 트리 자료구조.
  • 내부 노드들이 탐색 경로를 유도하고, 단말 노드들이 데이터 엔트리를 가지는 균형 트리.

좌: B+ tree, 우: B tree

 

* B tree vs B+ tree

  • B tree: 각 노드가 data를 가지고 있다.
  • B+ tree: 단말 노드를 제외한 노드들은 index로 사용되고, 단말 노드만 data를 가지며 이들은 linked list로 서로 연결되어 있다. 

 


Chapter 8: 시스템 카탈로그

시스템 카탈로그

  • DB가 가진 모든 data에 대한 설명 정보는 Catalog Relation에 저장되고, 이게 저장되는 DB를 System Catalog라 한다.

 

실습: 테이블 생성 (MySQL)

더보기
% mysql -u root -p

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| Module02           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> CREATE DATABASE Module03;
Query OK, 1 row affected (0.00 sec)

mysql> USE Module03;
Database changed

mysql> show tables;
Empty set (0.00 sec)


# Category Table 생성.
mysql> CREATE TABLE Category (
    -> CategoryNo int,
    -> CategoryName varchar(50) NOT NULL,
    -> CONSTRAINT pk_Category PRIMARY KEY(CategoryNo)
    -> );
Query OK, 0 rows affected (0.01 sec)

# Category Table의 schema 확인.
mysql> desc Category;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| CategoryNo   | int         | NO   | PRI | NULL    |       |
| CategoryName | varchar(50) | NO   |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

# Category Table 생성의 자세한 정보를 확인. -> ENGINE이 InnoDB 확인.
mysql> show create table Category;
+----------+-------------------------------------------------------------------+
| Table    | CreateTable                                                       |
+----------+-------------------------------------------------------------------+
| Category | CREATE TABLE `Category` (
  `CategoryNo` int NOT NULL,
  `CategoryName` varchar(50) NOT NULL,
  PRIMARY KEY (`CategoryNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

# Product Table 생성.
mysql> CREATE TABLE Product (                                                                                  -> ProductNo int,
    -> ProductName varchar(100) NOT NULL,
    -> UnitPrice int DEFAULT 0 NOT NULL,
    -> Description text,
    -> CategoryNo int,
    -> CONSTRAINT pk_ProductNo PRIMARY KEY(ProductNo),
    -> CONSTRAINT fk_Product_CategoryNo FOREIGN KEY(CategoryNo) REFERENCES Category(CategoryNo)
    -> );
Query OK, 0 rows affected (0.01 sec)

# Product Table의 schema 확인.
mysql> desc Product;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| ProductNo   | int          | NO   | PRI | NULL    |       |
| ProductName | varchar(100) | NO   |     | NULL    |       |
| UnitPrice   | int          | NO   |     | 0       |       |
| Description | text         | YES  |     | NULL    |       |
| CategoryNo  | int          | YES  | MUL | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)


# Customer Table 생성. -> ENGINE = MyISAM으로 설정.
mysql> CREATE TABLE Customer (
    -> CustomerNo int,
    -> CustomerName nvarchar(10),
    -> Email varchar(40),
    -> Password varchar(16),
    -> CONSTRAINT pk_Customer PRIMARY KEY(CustomerNo)
    -> ) ENGINE=MyISAM CHARSET=utf8;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

# Product Table의 schema 확인.
mysql> show create table Customer;
+----------+-------------------------------------------------------------------+
| Table    | Create Table                                                      |
+----------+-------------------------------------------------------------------+
| Customer | CREATE TABLE `Customer` (
  `CustomerNo` int NOT NULL,
  `CustomerName` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `Email` varchar(40) DEFAULT NULL,
  `Password` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`CustomerNo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

 


 

출처: https://github.com/gikpreet/class-relational_database

 

GitHub - gikpreet/class-relational_database

Contribute to gikpreet/class-relational_database development by creating an account on GitHub.

github.com