Oracle 스토리지 구조: 테이블스페이스·세그먼트·익스텐트·블록

Oracle 물리적·논리적 스토리지 계층(테이블스페이스, 세그먼트, 익스텐트, 데이터 블록)의 관계와 설계 기준을 설명합니다.

· 6 min read · PALDYN Team

지난 글에서 Oracle 백그라운드 프로세스가 메모리와 디스크 사이를 어떻게 중재하는지 살펴봤다. 이번에는 그 디스크 공간이 논리적으로 어떻게 조직되는지, 즉 Oracle 스토리지 계층 구조를 다룬다.

4단계 논리 계층

Oracle은 데이터를 논리적으로 Database → Tablespace → Segment → Extent → Data Block 순으로 관리한다.

Oracle 스토리지 논리 계층 구조

각 계층은 서로 명확히 구분된 역할을 갖는다.

계층물리 대응관리 주체
Database데이터 파일 전체Instance
Tablespace1개 이상의 데이터 파일DBA
Segment테이블·인덱스 등 객체 하나Oracle
Extent연속 블록 집합Oracle
Data BlockOS 파일 블록Oracle

Tablespace

테이블스페이스는 Oracle에서 공간을 관리하는 최상위 논리 단위다. 물리적으로는 하나 이상의 데이터 파일(.dbf)로 구성된다.

Oracle 설치 시 기본 생성되는 테이블스페이스:

  • SYSTEM: 딕셔너리(데이터 사전)
  • SYSAUX: AWR·Statspack 등 보조 데이터
  • USERS: 일반 사용자 기본 공간
  • TEMP: 정렬·해시 조인·임시 처리용
  • UNDO: 롤백과 읽기 일관성용 Undo 데이터

운영 환경에서는 애플리케이션 데이터, 인덱스, 이력 데이터를 별도 테이블스페이스로 분리하면 I/O 최적화와 장애 격리에 유리하다.


Locally Managed Tablespace (LMT)와 ASSM

과거 딕셔너리 기반 관리(DMT)는 딕셔너리 테이블에 Extent 정보를 저장해 경합이 심했다. 현재는 LMT(Locally Managed Tablespace)가 기본이다. Extent 할당 비트맵을 테이블스페이스 헤더 블록에 직접 저장해 딕셔너리 경합을 제거한다.

ASSM(Automatic Segment Space Management)은 세그먼트 내 블록 가용 공간을 비트맵으로 추적한다. Freelist 경합을 제거해 동시 DML 성능을 높인다.

-- 테이블스페이스 생성 (LMT + ASSM)
CREATE TABLESPACE app_data
  DATAFILE '/oradata/app_data01.dbf'
  SIZE 500M
  AUTOEXTEND ON NEXT 100M MAXSIZE 10G
  EXTENT MANAGEMENT LOCAL
  SEGMENT SPACE MANAGEMENT AUTO;

-- 사용자 기본 테이블스페이스 지정
ALTER USER app_user DEFAULT TABLESPACE app_data
  TEMPORARY TABLESPACE temp;

Segment

세그먼트는 테이블, 인덱스, Undo, 임시 세그먼트처럼 단일 데이터베이스 객체에 할당된 스토리지 집합이다. DBA_SEGMENTS로 확인할 수 있다.

-- 상위 10개 세그먼트 크기 조회
SELECT segment_name, segment_type,
       tablespace_name,
       ROUND(bytes / 1048576, 1) AS size_mb
FROM   dba_segments
ORDER  BY bytes DESC
FETCH FIRST 10 ROWS ONLY;

테이블 파티셔닝을 사용하면 파티션당 세그먼트가 독립적으로 생성된다. 파티션 프루닝으로 불필요한 세그먼트 접근을 건너뛸 수 있다.


Extent

Extent는 연속된 데이터 블록의 묶음으로, 공간 할당의 최소 단위다. Oracle은 세그먼트에 공간이 필요할 때 Extent 단위로 데이터 파일에서 공간을 할당한다.

UNIFORM SIZE를 지정하면 모든 Extent 크기가 동일해 단편화가 줄어든다.

-- Extent 정보 조회
SELECT segment_name, extent_id, file_id,
       block_id, blocks
FROM   dba_extents
WHERE  segment_name = 'ORDERS'
ORDER  BY extent_id;

Data Block

데이터 블록은 Oracle이 데이터를 읽고 쓰는 최소 I/O 단위다. 기본 크기는 8KB(DB_BLOCK_SIZE)이며, 데이터베이스 생성 시 결정된다. 블록 내부 구조는 다음과 같다.

영역설명
Header블록 주소(DBA), 세그먼트 유형, SCN
Table Directory행 데이터를 담은 테이블 목록
Row Directory각 행의 오프셋 포인터
Free SpaceINSERT·UPDATE를 위한 여유 공간 (PCTFREE)
Row Data실제 행 데이터
-- 블록 크기 및 파라미터 확인
SELECT name, value
FROM   v$parameter
WHERE  name IN ('db_block_size',
                'db_file_multiblock_read_count');

테이블스페이스 용량 모니터링

테이블스페이스 관리 DDL 예시

-- 테이블스페이스별 사용량·잔여 공간
SELECT tablespace_name,
       ROUND(used_space     * 8 / 1024) AS used_mb,
       ROUND(tablespace_size * 8 / 1024) AS total_mb,
       ROUND(used_percent, 1)            AS pct
FROM   dba_tablespace_usage_metrics
ORDER  BY used_percent DESC;

90% 이상이면 데이터 파일 추가 또는 AUTOEXTEND를 검토해야 한다.


설계 체크리스트

  • 운영 데이터·인덱스·이력 데이터를 테이블스페이스 단위로 분리한다.
  • UNDO 테이블스페이스 크기를 과소 설계하면 ORA-01555: snapshot too old 오류가 발생한다. UNDO_RETENTION 값과 실제 Undo 사용량을 주기적으로 확인하라.
  • TEMP 테이블스페이스가 부족하면 대형 정렬·해시 조인이 실패한다.
  • DB_BLOCK_SIZEOLTP는 8KB, DW는 16KB~32KB가 일반적이다.

지난 글: Oracle 백그라운드 프로세스

다음 글: Oracle Redo·Undo·플래시백


읽어주셔서 감사합니다. 😊