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는 계층화된 기억 장치로 관리되고, 각 기억 장치는 각각 독립된 구성요소들에 의해 관리된다.
- 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들의 집합)를 담을 수 있는 슬롯.
버퍼 교체 전략
- LRU (Least Recently Used): 가장 최근에 사용한 페이지를 교체하는 전략.
- Closk: LRU의 변형으로, 1 ~ N 사이의 값을 가지는 current 변수를 사용하여 교체용 페이지를 선정.
- 그 외 방식들 - FIFO, MRU, Random ...
버퍼 관리 기법 비교
- OS의 Virtual memory와 DBMS의 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에 연속적으로 저장.
- 빠르지만 메모리 공간이 낭비될 수 있다.
가변 길이 레코드 (Variable-length Record)
- 각 Length of Field가 가변적인 경우, 해당 레코드의 길이가 가변적이게 된다.
- (1) Field를 구분자($)로 구분하여 연속적으로 저장. (2) 레코드의 앞 부분에 정수로 된 offset들을 배열로 저장.
- 느리지만 메모리 공간을 절약할 수 있다.
Chapter 6: 페이지 형식
페이지 형식
- Page: record가 탑재되는 slot의 모임.
- record는 RID(<page no>, <slot no>의 쌍)로 식별됨.
- Paging:
고정 길이 레코드
- slot은 같은 형태이며, 연속적으로 배치 가능.
- (1) record를 처음의 N slot에 순서대로 배치, (2) offset 비트맵 사용.
가변 길이 레코드
- 새 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 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
'DB' 카테고리의 다른 글
[Relational database] 04. 파일 조직과 인덱스 (1) | 2024.10.03 |
---|---|
[Relational database] DB 확장 - Scale Up vs Scale Out (2) | 2024.10.03 |
[Relational database] DDL, DML, DCL, TCL (0) | 2024.10.01 |
[Relational database] 02. 관계형 모델 (Relational model) *제약조건 (1) | 2024.10.01 |
[Relational database] 01. 데이터 베이스 개요 *ACID (0) | 2024.09.30 |