일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- BOJ
- 페이지 부재율
- 컴퓨터구조
- 스케줄링
- 운영체제
- 스레드
- Algorithm
- 우선순위
- 기아 상태
- 추상화
- PYTHON
- 단편화
- 알고리즘
- 프로세스
- 부동소수점
- 교착상태
- fork()
- 가상 메모리
- 페이지 대치
- 동기화
- 인터럽트
- 백준
- 세마포어
- Oracle
- mips
- 트랩
- concurrency
- 페이징
- ALU
- mutex
- Today
- Total
봉황대 in CS
[Oracle] Database Physical & Logical Storage Structures 본문
[Oracle] Database Physical & Logical Storage Structures
등 긁는 봉황대 2024. 7. 2. 15:41* 본 글은 ‘친절한 SQL 튜닝’ 책과 Oracle 공식 문서들을 바탕으로 작성하였습니다. (참고한 문서의 링크는 하단에 첨부)
Overview of Oracle Database Storage Structures
Oracle 데이터베이스의 전체적인 저장 구조는 다음과 같다.
그림에서 여러 unit이 존재하는 것을 볼 수 있는데,
이들은 physical storage structure와 logical storage structure로 구분할 수 있다.
이 글에서는 위 그림에 그려져 있는 구조들에 대해서만 설명하겠다. (문서들을 파고들수록 양이 너무 방대해져서 ..)
관계형 데이터베이스 관리 시스템(RDBMS)의 특징 중 하나는
logical data structure와 physical storage structure들을 독립적으로 관리하는 것이다.
이로써 physical storage에 존재하는 어떤 데이터를 변경해도,
논리적(Application level에 추상화된, 예를 들면 table) level에는 영향을 끼치지 않게 된다.
Physical storage structure
OS level(엄밀히는 Operating system file system level)에서 다루는 단위이다.
- Data file
Logical storage structure
Oracle 데이터베이스(Application level)에서 다루는 단위이다.
- Tablespace
- Segment
- Extent
- Data block
아래는 구조들 간의 관계를 ERD 다이어그램으로 표현한 것이다.
[참고] A -< B : '하나의 A는 하나 이상의 B로 구성되어 있다'라는 의미를 가진다.
그럼 이제 가장 작은 unit부터 시작하여 그들을 포함하는 상위 unit까지, 이 놈들이 각자 어떤 역할을 가지는지 알아보자.
Data block, Extent, Segment
Data block
Oracle 데이터베이스에서 데이터를 읽고 쓰는 단위로, record(i.e., row)를 실제로 저장하는 공간이다.
logical block, Oracle block 또는 page라고도 부른다.
Oracle은 기본적으로 8KB(8192 bytes) 크기의 block을 사용하는데,
이는 데이터 I/O의 단위이므로 특정 record 하나를 읽고 싶어도 해당 block을 통째로 읽어온다.
OS file system level에 존재하는 block과는 다른 놈이다.
따라서 Oracle이 데이터를 요청할 때는 OS block 기준이 아닌, Oracle data block을 기준으로 데이터를 요청한다.
Multi-table cluster일 경우에는 한 block에 여러 table record가 같이 저장될 수 있으나,
아닐 경우에는 한 block을 한 table이 독점한다.
Data block의 내부 구조는 다음과 같다.
Data block overhead
Data block header, table directory, row directory를 묶어서 overhead라고 부른다.
(metadata(데이터를 위한 데이터)의 집합에게 이름을 붙인 것으로 이해했다)
- Header (Common and variable) : block에 대한 정보를 담는 부분이다. (block address, type of segment: data || index)
- Table directory : 해당 block에 저장되어 있는 row들이 속하는 table의 정보를 담는 부분이다.
- Row directory : row들의 정보(특히 address 정보)를 담는 부분이다.
Free space
새로운 row를 insert 해야 해거나, update 연산에서 추가적인 공간이 필요한 경우에 사용하는 공간이다.
[참고]
Free space management는 segment를 기준으로 진행되는데, in-segment free/used space가 bitmap을 통해서 관리된다.
Row data
table 또는 index의 실제 데이터를 저장하는 부분이다.
[참고]
ROWID : table record가 disk 상에서 어디에 저장됐는지를 가리키는 위치 정보이다.
A rowid is not physically stored in the database, but is inferred from the file and block on which the data is stored.
Extent
A specific number of contiguous data blocks allocated for storing a specific type of information.
공간을 확장하는 단위로, table이나 index에 데이터를 입력하다가 공간이 부족해지면 extent를 추가로 할당받는다.
이는 연속된 data block들의 집합이다.
따라서 Multi-table cluster가 아닐 경우에는 한 data block을 한 table이 독점하기 때문에, 한 extent도 한 table이 독점한다.
Segment
A set of extents, each of which has been allocated for a specific data structure
and all of which are stored in the same tablespace.
데이터 저장 공간이 필요한 object(e.g., table, index, partition 등)를 저장하는 단위로, 여러 extent로 구성된다.
segment는 세 종류가 존재한다.
- Data segment : table 데이터를 저장한다.
- Index segment : index 데이터를 저장한다.
- Temporary segment
: SQL parsing 또는 execution 시 temporary workspace를 요구하는 경우가 존재하는데, 그때 할당하여 사용된다.
처음에는 한 segment에 대해서 하나의 extent를 할당한다.
그 후, segment에게 할당된 extent들이 꽉 찼다면, Oracle이 새로운 extent를 할당해 준다.
Data file, Tablespace
Data file
Physical structures that conform to the operating system in which Oracle is running.
Disk 상의 물리적인 OS 파일이다.
위 그림에서 볼 수 있듯이, 한 tablespace에 data file이 하나 이상 할당된다.
반대 관점에서 보면, 한 data file은 한 tablespace가 독점한다.
Tablespace
An Oracle database consists of one or more logical storage units called tablespaces,
which collectively store all of the database's data.
segment를 담는 logical storage container로, 하나 이상의 data file로 구성된다.
앞서 segment는 object를 저장하는 단위이고, 공간을 확장하는 단위는 extent라고 했다. (segment ⊃ extents)
즉, extent는 필요에 따라서 추가로 할당되기 때문에
한 segment에 속한 extent들은 같은 data file에 저장되어 있지 않을 확률이 더 높다.
하나의 tablespace를 여러 data file로 구성하면
DBMS가 파일 경합을 줄이기 위해 데이터를 가능한 한 여러 data file로 분산해서 저장하기 때문이다.
extent의 관점에서 다시 말하자면,
하나의 extent 내에서 data block들은 서로 인접한 연속된 공간에 존재하지만, extent 끼리는 연속된 공간에 존재하지 않을 수도 있다.
참고
p.s. 여러 자료들을 보면서 제 식대로 해석하며 정리한 글이라, 틀린 것이 있다면 댓글로 정정 부탁드립니다 :)
'Computer Science & Engineering > Database' 카테고리의 다른 글
[Oracle] SQL Processing - Library Cache, Soft parse vs. Hard parse (2) | 2024.09.20 |
---|---|
[Concurrency Control] Index-locking Protocol: The Way to Prevent Phantom Reads (0) | 2024.08.12 |
[Database] Isolation Levels (4) | 2024.08.11 |
[Oracle] Latch vs. Lock ?? (0) | 2024.07.27 |
[Concurrency Control] Optimistic Version Locking (2) | 2024.06.10 |