📌 7장에서는 오라클이 데이터를 실제로 보관하는 방식인 '데이터 구조'에 관하여 알아보며, 데이터를 꺼내고 집어넣을 때 어떤 방식으로 데이터가 보관되는 것이 유리할지 알아봅니다. 또한, 테이블스페이스, 세그먼트, 익스텐트, 블록등의 용어도 살펴봅니다.
7.1 | 오라클의 데이터 구조를 왜 배워야 하는가?
· 오라클은 데이터를 관리하는 시스템이므로 데이터를 어떻게 저장하고 있는지를 이해하는 것은 오라클을 알기 위해선 필수
· 오라클은 전달받은 데이터를 '몇 개의 상자(데이터 구조)'로 나누어 저장하도록 고안됨.

7.2 | 가변 길이 데이터를 관리할 프로그램을 만들기 위해서는?
· 데이터를 파일의 선두에서부터 차례대로 넣어 두면 쉽게 구현할 수 있을 것처럼 보이나, '데이터 변경'이나 '동시 처리'의 문제가 발생


· 데이터베이스 관리를 위해서는 어떤 테이블이 어떤 데이터를 가졌는지에 대한 정보가 필요함. 하지만, 파일의 선두에서부터 차례대로 데이터를 입력해 나가는 방식이라면 데이터가 100만 건 있을 때는 100만 개의 관리 정보가 필요. 즉, 데이터 관리나 I/O 관리가 힘들어짐.
7.2.1 필요한 데이터 구조
· 위와 같은 부분에 대해 완전하지는 않지만, 유효한 대처 방법이 존재함. 이는 '적당한 크기로 정리(뭉친다)'라는 접근 방식임. 예를 들어, 100만 건을 각각 관리 하는 것은 매우 힘들지만, 1만 건을 한 개의 집합으로 관리하면 100개의 관리정보만 있으면 됨. 또한 I/O 횟수도 100회로 충분
· 데이터를 변경하려는 것도 일정 데이터양(집합)마다 변경에 필요한 공간을 확보해두면 쉽게 처리할 수 있음
· 빠르게 데이터를 입력할 수 있도록 비어있는 공간에 대한 관리도 필요

▼ 정리해보면 다음의 세 가지를 구현할 수 있는 구조가 필요
(1) 관리 및 I/O의 효율을 고려해 공간을 어느 정도의 크기로 뭉쳐서 할당한다.
(2) 데이터 변경에 필요한 공간을 확보한다.
(3) 비어 있는 공간을 관리한다.
7.3 | 오라클의 데이터 구조
· 오라클의 데이터 구조는 크게 물리 구조, 논리 구조로 나눌 수 있음.
· 물리 구조는 데이터 파일 등의 OS에서 보이는 구조를 의미
· 논리 구조는 OS에서는 식별할 수 없는 오라클 내부의 구조(ex. 데이터 파일 안에 보관된 '테이블', '로우(행)')

7.3.1 데이터 파일과 테이블의 관계
· 논리적인 구조인 테이블은 물리적인 구조인 데이터 파일에 다음과 같이 보관됨

· 테이블은 여러 개의 블록으로 구성되어 있지만, 이 상태로는 한 개의 테이블이 여러 장소에 분산된 상태로 존재하며, 몇 만·몇십 만에 가까운 블록을 관리하는 사태가 발생하기 때문에 효율적이지 않음. 그래서 '익스텐트'라고 하는 한 가지 구조를 더 도입
· 익스텐트는 연속된 블록의 집합으로, 익스텐트 덕분에 각 블록의 위치가 아니라 각 익스텐트의 첫 위치와 블록의 개수만으로 데이터를 관리할 수 있으며, 관리 정보도 줄일 수 있게 됨. 또한, 데이터를 한 번에 읽어올 수 있으므로 테이블의 풀 스캔 성능을 향상할 수도 있음
· 더욱이 테이블이나 인덱스 등의 데이터를 한번 더 모은 익스텐트의 집합을 '세그먼트'라고 부름
7.4 | 데이터 구조에는 어떤 것들이 있는가?
7.4.1 세그먼트
·세그먼트는 '많은 데이터를 보관하기 위한 구조'를 의미하며, '익스텐트의 집합'이라고도 할 수 있음
· 사용자용 세그먼트인 테이블이나 인덱스 외에도 오라클이 자동으로 생성하는 세그먼트도 있음. (ex. 데이터를 정렬하기 위한 세그먼트나 UNDO라고 불리는 과거 데이터를 보관하는 세그먼트 등)
7.4.2 테이블 스페이스
· '세그먼트를 분류해서 보관하기 위한 상자'이며, 한 개 이상의 데이터 파일로 구성되어 있음
· 오라클이 데이터베이스를 관리하기 위해 사용하는 테이블스페이스와 사용자가 사용하는 테이블 스페이스 등 몇가지 종류가 존재
· 테이블스페이스의 집합(물리적으로는 데이터 파일의 집합)과 REDO 로그 파일, 컨트롤 파일이 모이면 하나의 데이터베이스가 됨
7.4.3 블록 안의 공간
· 오라클은 블록 안에 데이터 변경에 대비한 공간을 남겨두며, 빈 블록을 세그먼트 단위로 관리하고 있음
· 세그먼트 안에 공간이 모자란 상황이 오면 세그먼트에 새로운 익스텐트를 추가하고 빈 블록을 늘림
7.4.4 ROWID
· 오라클에서는 데이터 로우의 주소를 'ROWID'라고 부르며, 데이터 파일의 번호나 데이터 파일 안의 블록 번호, 블록 안에 로우 번호와 같은 정보로 구성되어 있음
7.5 | 실제 흐름을 따라 각 동작을 확인
7.5.1 공간 할당하기 및 비어 있는 공간의 관리
·실제 업무에서는 수행하는 순서로 공간을 할당하는 것과 비어있는 공간을 관리하는 동작을 확인
① 데이터베이스의 생성
· SYSTEM 테이블스페이스를 시작으로 몇 가지 테이블스페이스가 생성
-- 'orcl' 데이터베이스를 생성하는 명령어
create database orcl
/* ···중략··· */
datafile '/u01/app/oracle/ordata/ORCL/system.dbf' size 4G
sysaux datafile '/u01/app/oracle/oradata/ORCL/sysaux.dbf' size 4G
default temporary tablespace TS_temp tempfile '/u01/app/oracle/oradata/ORCL/TS_temp01.dbf' size 8G
undo tablespace TS_undo datafile '/u01/app/oracle/oradata/ORCL/TS_undo01.dbf' size 8G;
② 사용자용 테이블스페이스의 생성
· 사용자용 테이블스페이스를 생성되며, 이 시점에서 테이블스페이스는 비어 있는 공간을 가지게 됨
-- 'users01' 테이블스페이스를 생성하는 명령어
create tablespace user01
/* ···중략··· */
datafile '/u01/app/oracle/oradata/ORCL/users01_1.db' size 1G extent management local;
③ 테이블을 테이블스페이스의 생성
· 3-1. 테이블스페이스에 테이블을 생성하며, 이 시점에서 내부가 비어있는 상태로 익스텐트가 생성됨.
· 3-2. 익스텐트가 생성된 후에 데이터 입력(INSERT)이 수행되며, 익스텐트의 비어 있는 블록에 데이터를 입력
· 3-3. 'PCTFREE'라는 임계치에 도달하면 해당 블록에 입력하는 것을 멈추고 '이 블록에는 공간이 없다'고 인식 후 다음 비어 있는 블록에 데이터 입력
· 3-4. 데이터의 입력이 계속되어 익스텐트가 가득 차게 되면 테이블스페이스가 가지고 있는 빈 공간을 사용해 새로운 익스텐트를 테이블에 할당하고 데이터를 입력할 수 있게 함
-- 'TEST' 테이블을 생성하는 명령어
CREATE TABLE TSET(NO NUMBER, TEXT VARCHAR2(100));
-- 해당 계정이 갖고있는 익스텐트를 조회하는 뷰
SELECT * FROM USER_EXTENTS WHERE TABLESPACE_NAME = 'USERS01';
7.6 | 프로세스에서 본 데이터 구조
· 오라클의 메모리 내부(특히 캐시)에는 대부분의 데이터를 블록(오라클 블록)이라는 단위로 관리하고 있음.
[ ▼ 메모리 내부의 동작에 대해 검색(SELECT)과 변경(UPDATE)의 예시 ]
① 검색(SELECT / 풀스캔의 경우)
· 1-1. 테이블의 전체 데이터를 읽어올 필요가 있으며, 해당 테이블의 익스텐트를 조사
· 1-2. 버퍼 캐시에 존재하지 않는 블록을 처음부터 읽어옴
② 변경(UPDATE / 인덱스를 이용해 한 건만 변경하는 경우)
· 2-1. 우선 인덱스에 접근하고 인덱스의 관리 정보를 토대로 인덱스의 루트 블록(가장 위의 블록)을 찾아감
· 2-2. 캐시에 없다면 블록을 읽어옴
· 2-3. 루트 블록에서 다음 블록의 주소를 조사하고, 그 블록이 캐시에 적재되어 있지 않다면 디스크에서 읽어옴
· 2-4.이렇게 반복해서 필요한 데이터의 ROWID를 확인하고, 해당되는 데이터 블록을 찾음
· 2-5. 대상 테이블 데이터의 블록이 캐시에 적재되어 있지 않다면 해당 블록만을 읽어옴
· 2-6. 캐시상에서 블록의 데이터를 변경(*지금까지 설명한 처리는 서버 프로세스가 수행)
· 2-7. DBWR(DataBase WRiter) 백그라운드 프로세스가 잠시 후에 데이터 파일에 변경된 데이터를 기록
7.7 | 요약
· 테이블스페이스는 세그먼트를 집어넣기 위한 용기로서 하나 이상의 데이터 파일로 구성된다.
· 일반적으로 테이블이나 인덱스는 세그먼트다.
· 세그먼트는 익스텐트로 구성되며, 익스텐트는 연속된 블록으로 구성되어 있다.
· 세그먼트는 테이블스페이스 여러 개에 걸쳐서 존재할 수 없다(세그먼트는 테이블스페이스에 소속되므로)
· 익스텐트는 데이터 파일 여러 개에 걸쳐서 존재할 수 없다(익스텐트는 연속된 블록이므로)
· 일반적으로 테이블이나 인덱스는 테이블스페이스가 가지고 있는 공간에서 새로운 익스텐트를 할당받음으로써 크기가 커진다.
· 블록 안의 데이터 변경용 공간은 'pctfree'라는 파라미터로 제어한다.
· 로우(행)는 블록에 보관되어 있다.
'📕 Oracle > [서적] 그림으로 공부하는 오라클 구조' 카테고리의 다른 글
| [Oracle 구조] 8. 오라클의 대기와 LOCK (1) | 2024.01.06 |
|---|---|
| [Oracle 구조] 6. 커넥션과 서버 프로세스의 생성 (1) | 2023.12.30 |
| [Oracle 구조] 5. 오라클의 기동과 정지 (1) | 2023.12.29 |
| [Oracle 구조] 4. SQL문 분석과 공유풀 (1) | 2023.12.26 |
| [Oracle 구조] 3. 캐시와 공유 메모리 (1) | 2023.12.25 |