페이지와 익스텐트
SQL Server에서 데이터 저장의 기본 단위는 페이지입니다. 여덟 개의 연속된 페이지가 모여 익스텐트를 구성하며, 이는 페이지 관리를 효율화합니다. 모든 SQL Server 버전에서 페이지와 익스텐트를 관리하는 데이터 구조를 이해하는 것은 고성능 데이터베이스 설계의 핵심입니다.
페이지 기본 구조
데이터 파일(.mdf/.ndf)의 디스크 공간은 0부터 n까지 연속 번호가 부여된 페이지로 논리적으로 분할됩니다. 모든 디스크 I/O 작업은 페이지 단위로 수행되며, 각 페이지의 크기는 8KB로 고정됩니다. 페이지 시작부에는 96바이트 헤더가 위치하며, 여기서 페이지 번호/유형/사용 가능 공간 등 시스템 정보를 관리합니다.
페이지 유형 분류
| 유형 | 설명 |
|---|---|
| 데이터 페이지 | TEXT/IMAGE 형식을 제외한 사용자 데이터 저장 |
| 인덱스 페이지 | 인덱스 엔트리 저장 |
| 텍스트/이미지 페이지 | 대형 객체(LOB) 및 8KB 초과 가변 길이 데이터 저장 |
| GAM/SGAM | 익스텐트 할당 상태 추적 |
| PFS | 페이지 할당 및 공간 사용률 정보 |
| IAM | 할당 단위별 익스텐트 사용 정보 |
페이지 유형은 객체 생성 시 데이터 유형에 따라 결정되며, 로그 파일은 페이지 구조를 사용하지 않습니다.
데이터 페이지 내부 구조
데이터 페이지에서는 헤더 이후에 행이 순차적으로 배치됩니다. 페이지 끝에는 행 오프셋 테이블이 존재하며, 각 항목은 해당 행의 시작 위치를 역순으로 기록합니다. 이 구조를 통해 SQL Server는 특정 행을 빠르게 찾을 수 있습니다.
행 오버플로우 처리
단일 행의 최대 크기는 8,060바이트로 제한되지만, 가변 길이 열(varchar, nvarchar 등)이 포함된 테이블에서는 예외가 적용됩니다. 행 크기가 제한을 초과할 경우 SQL Server는 가장 큰 가변 길이 열부터 ROW_OVERFLOW_DATA 할당 단위로 이동시키고, 원본 페이지에 24바이트 포인터를 남깁니다. 이후 행 크기가 줄어들면 자동으로 원래 위치로 복원됩니다.
-- 고정 길이 열로 생성 실패 예시
CREATE TABLE FixedTable (
col1 CHAR(4000),
col2 CHAR(4000),
col3 CHAR(1000)
);
-- 오류: 행 크기 8007바이트가 8060바이트 제한 초과
-- 가변 길이 열로 생성 및 데이터 삽입
CREATE TABLE VariableTable (
colA VARCHAR(4000),
colB VARCHAR(4000),
colC VARCHAR(4000)
);
INSERT INTO VariableTable
VALUES (
REPLICATE('A', 2500),
REPLICATE('B', 2500),
REPLICATE('C', 2500)
);
-- 할당 단위 정보 확인
SELECT
OBJECT_NAME(p.object_id) AS TableName,
au.allocation_unit_id,
au.type_desc AS PageType,
p.rows
FROM sys.partitions p
JOIN sys.allocation_units au ON p.partition_id = au.container_id
WHERE p.object_id = OBJECT_ID('VariableTable');
-- 페이지 할당 정보 진단
DBCC IND('DatabaseName', 'VariableTable', -1);
핵심 정리
SQL Server의 저장 구조는 8KB 페이지를 기반으로 동작하며, 다양한 유형의 페이지가 협력하여 데이터를 관리합니다. 행 오버플로우 발생 시 가변 길이 열을 동적으로 이동시키는 메커니즘을 통해 유연성을 확보합니다. 페이지 내 행 배치 방식과 오프셋 테이블 구조는 데이터 접근 효율성을 보장합니다.