데이터베이스 관리자(DBA)나 개발자가 성능 최적화를 논할 때 가장 먼저 마주하는 개념이 바로 스토리지 구조입니다. 데이터가 물리적으로 어디에 담기고, 논리적으로 어떻게 쪼개어 관리되는지 이해하는 것은 SQL 튜닝과 장애 대응의 기초가 됩니다. 오늘은 오라클 스토리지의 계층적 구조와 각 요소의 핵심 역할을 정리해 보겠습니다.

1. 오라클 스토리지의 계층적 구조 (Logical vs Physical)
오라클의 저장 공간은 크게 논리적 구조와 물리적 구조로 나뉩니다. 이를 계층적으로 나열하면 마치 ‘아파트 단지’와 같은 구조를 가집니다.
| 계층 | 명칭 | 비유 | 핵심 역할 |
| L1 | 데이터베이스 | 아파트 단지 | 전체 데이터의 집합체 |
| L2 | 테이블스페이스 | 아파트 한 동 | 논리적 저장 공간 (하나 이상의 데이터 파일로 구성) |
| L3 | 세그먼트 | 세대 (집) | 테이블, 인덱스 등 실제 저장 공간을 가진 오브젝트 |
| L4 | 익스텐트 | 방 (Room) | 공간 할당의 기본 단위 (연속된 블록의 모임) |
| L5 | 데이터 블록 | 벽돌 | I/O(입출력)의 최소 단위 |
2. I/O 성능의 핵심: 데이터 블록 (Data Block)
데이터 블록은 오라클이 데이터를 읽고 쓰는 가장 작은 단위입니다.
-
크기 결정:
DB_BLOCK_SIZE파라미터로 결정되며, 보통 8KB를 가장 많이 사용합니다. -
I/O 효율성: 사용자가 단 하나의 로우(Row)만 조회하더라도 오라클은 해당 로우가 포함된 블록 전체를 메모리(SGA)로 올립니다. 따라서 블록 설계를 어떻게 하느냐에 따라 I/O 성능이 갈립니다.
[실무 Insight: 블록 크기 선택의 기준]
실제 운영 환경에서 OLTP(트랜잭션 위주) 시스템은 8KB를 선호하지만, 대용량 데이터를 분석하는 DW 시스템에서는 16KB나 32KB처럼 큰 블록 사이즈를 사용하여 한 번의 I/O로 더 많은 데이터를 읽어오도록 설계하기도 합니다.
3. 블록 내부 구조와 공간 관리 옵션
데이터 블록 내부는 단순히 데이터만 쌓이는 것이 아니라, 관리 정보와 여유 공간이 치밀하게 계산되어 있습니다.
블록 내부 구성
-
Header: 주소 정보, 트랜잭션 슬롯(ITL) 등 관리 정보 저장 (위에서 아래로 채워짐)
-
Free Space: 데이터 수정을 대비한 빈 공간
-
Data: 실제 로우 데이터가 저장되는 공간 (아래에서 위로 채워짐)
효율적 관리를 위한 튜닝 파라미터
-
PCTFREE: 향후
UPDATE로 인해 데이터 길이가 길어질 것을 대비해 비워두는 비율입니다.-
경험적 팁: 업데이트가 빈번한 테이블에서 이 값이 너무 작으면 Row Chaining(행 연쇄) 현상이 발생해 성능이 급격히 떨어질 수 있습니다.
-
-
INITRANS: 블록에 동시에 접근할 수 있는 트랜잭션 슬롯의 초기 개수입니다. 동시성 부하가 높은 테이블이라면 이 값을 기본값보다 높게 설정하는 것이 유리합니다.
4. 논리적 구조와 물리적 구조의 연결고리
논리적인 개념들은 결국 디스크상의 물리적 파일에 저장됩니다.
-
데이터 파일(Data File): 디스크에 실제 존재하는 파일(
.dbf)입니다. 논리적 단위인 테이블스페이스는 하나 이상의 물리적 데이터 파일과 연결됩니다. -
운영체제 블록(OS Block): OS 수준의 I/O 단위입니다. 오라클 블록은 대개 OS 블록의 배수로 설정하여 I/O 효율을 맞춥니다.
오라클 스토리지를 이해하는 것은 단순히 지식을 습득하는 것을 넘어 “어디에서 병목이 발생하는가?”에 대한 답을 찾는 과정입니다. 인덱스를 생성했는데 왜 성능이 안 나오는지, 왜 특정 테이블에서만 대기 이벤트가 발생하는지는 결국 이 블록과 익스텐트의 관리 방식에서 실마리를 찾게 됩니다.