페이지(Page)
SQL Server 의 페이지는 데이터 저장의 기본 단위이며, 하나의 페이지는 8KB 크기를 가진다. (페이지 크기 변경 불가)
*타 DBMS 와 비교!
- Oracle 의 데이터 저장 기본 단위는 '블록(Block)' 이며, 기본 크기는 8KB 이다. (2~32KB 사이로 변경 가능)
- MySQL 의 데이터 저장 기본 단위는 '페이지(Page)' 이며, 기본 크기는 16KB 이다. (4,8,16KB 로 변경 가능)
SQL Server 의 데이터 파일(.mdf, .ndf) 은 연속적인 페이지의 집합으로 구성되어 있으며, 디스크 I/O 작업을 수행할 때 이러한 페이지들을 읽고 쓴다.
SQL Server의 데이터 파일은 크게 세 가지 유형의 페이지로 구성된다.
파일 헤더 페이지
파일의 시작 지점, 파일의 크기, 파일의 성장 정보, 데이터베이스의 버전과 같은 메타데이터가 포함되어 있다.
또한, 백업과 복구에 필요한 정보, 파일에 할당된 페이지 수, 그리고 데이터베이스가 마지막으로 컨시스턴트한 상태였던 시점 등의 정보가 저장된다.
시스템 페이지
PFS, GAM, SGAM, IAM, BCM, DCM 와 같은 데이터베이스의 공간 할당 및 관리에 필요한 정보가 저장된다.
PFS 페이지는 페이지의 사용 여부와 사용 가능한 공간을 추적하며, GAM 페이지는 익스텐트가 전체적으로 사용 가능한지 여부를 추적한다. 또, SGAM 페이지는 혼합 익스텐트의 사용 가능 여부를 추적하며, IAM 페이지는 특정 테이블이나 인덱스에 할당된 페이지를 추적한다. 자세한 설명은 아래 '익스텐트 할당 관리' 내용에서 확인해보자.
데이터 및 인덱스 페이지
데이터와 인덱스 정보가 저장이 되는데, 데이터 및 인덱스 페이지의 구성은 아래와 같이 구성된다.
1) 페이지 헤더
각 페이지마다 처음에 시작되는 페이지이며, 0~96 바이트까지의 크기로 구성된다. 해당 페이지의 상세 정보를 포함하며, 페이지 번호, 페이지 유형, 페이지 크기 등의 시스템 정보가 저장된다.
2) 데이터 및 인덱스 행
페이지 헤더 바로 뒤부터 Row 단위로 저장이 되며, 데이터 및 인덱스가 저장된다.
3) 행 오프셋 테이블 (Row Offset Table)
페이지의 가장 끝부터 역순으로 저장이 되며, 각 데이터 행의 주소값을 저장한다. 각 행 오프셋은 페이지 시작부터 행의 첫 번째 바이트가 얼마나 멀리 떨어져 있는지를 저장하며, 이를 통해 SQL Server 가 페이지에서 해당 데이터를 빠르게 찾을 수 있도록 하는 것이다.
익스텐트(Extent)
익스텐트는 8개의 페이지의 집합으로 구성되어 있으며, 총 64KB(8KB*8) 의 데이터 공간이다.
익스텐트에는 두가지 유형이 있다.
1) 균일 익스텐트 (Uniform Extent)
하나의 객체(테이블 또는 인덱스) 가 전체 할당된 익스텐트를 말한다.
2) 혼합 익스텐트 (Mixed Extent)
여러개의 객체가 섞여서 할당된 익스텐트를 말한다.
데이터베이스 할당 관리
익스텐트 할당 관리 (GAM, SGAM)
위에서 이야기한 것과 같이 데이터 파일 내에는 대부분 일반 페이지(데이터 페이지, 인덱스 페이지) 로 구성되어 있지만,
데이터베이스의 페이지 및 익스텐트 공간 할당과 관련된 정보를 관리하는 시스템 페이지가 있다. 이 시스템 페이지에는 PFS, GAM, SGAM, DCM, BCM, IAM 이 존재한다.
일반적인 익스텐트에는 시스템 페이지들이 포함되지 않으며, 각 시스템 페이지마다 규칙에 따라 데이터베이스 파일 내의 각각 고정된 위치에 존재한다. 관련하여 알아보자.
1) GAM (전역 할당 맵: Global Allocation Map)
GAM(Global Allocation Map) 페이지는 할당된 익스텐트의 상태를 추적하며, SQL Server 가 데이터를 저장할 수 있는 공간을 찾는데 사용된다. 익스텐트가 할당되었는지 여부를 비트맵으로 나타내며, 비트가 1이면 해당 익스텐트가 할당되지 않아 사용 가능하며, 0이면 이미 할당되어 사용할 수 없음을 의미한다. GAM 페이지는 데이터베이스 파일 내에서 두 번째 페이지에 위치하며, 이후 약 4GB 간격으로 반복하여 배치된다.
비트 | GAM |
0 | 해당 익스텐트는 '할당됨(사용중)' 상태이며, 익스텐트 내 1개 이상의 페이지가 사용 중 |
1 | 해당 익스텐트는 '미할당(사용가능)' 상태이며, 익스텐트 내의 모든 페이지(8 페이지) 가 비어 있음 |
2) SGAM (공유 전역 할당 맵: Shared Global Allocation Map)
SGAM(Shared Global Allocation Map) 페이지는 익스텐트 공간 할당을 추적 및 관리하는데 GAM(Global Allocation Map) 페이지와 함께 사용된다. SGAM은 특히 혼합 익스텐트(Mixed Extent) 의 할당 상태를 나타내며, 비트맵 형태로 각 익스텐트의 상태를 표시한다. 비트가 1인 경우 혼합 익스텐트이며, 사용 가능함을 의미하고, 0인 경우에는 혼합 익스텐트가 아니거나 모든 페이지가 사용 중임을 나타낸다. GAM이 모든 익스텐트의 할당 상태를 관리하는 것에 비해, SGAM은 혼합 익스텐트에 초점을 맞추며, 데이터베이스 파일 내에서 GAM 페이지 바로 다음인 세 번째 페이지에 위치하고, 4GB 간격으로 반복하여 배치된다.
비트 | SGAM |
0 | 1. 해당 익스텐트가 혼합 익스텐트가 아님 2. 해당 익스텐트가 혼합 익스텐트이나, 모든 페이지(8 페이지) 가 사용 중 |
1 | 해당 익스텐트가 혼합 익스텐트이며, 익스텐트 내 사용 가능 페이지가 1개 이상 있음 |
익스텐트 할당 관리 아키텍처
SQL Server는 GAM과 SGAM 페이지를 아래 방식으로 사용하여 익스텐트의 할당 상태를 관리한다.
1. 균일 익스텐트 할당 시, 데이터베이스 엔진은 GAM에서 비트가 1(사용 가능한 익스텐트) 인 것을 찾아 해당 비트를 0으로 변경하여 할당 상태를 기록한다.
2. 혼합 익스텐트 할당 시, GAM에서 먼저 비트가 1(사용 가능한 익스텐트) 인 것을 찾고, 해당 비트를 0으로 변경한 다음, SGAM에서 해당 익스텐트의 비트를 1로 설정하여 혼합 익스텐트임을 표시한다.
3. 익스텐트의 할당을 취소할 때는 GAM의 해당 비트를 다시 1로 변경하고, SGAM의 비트를 0으로 변경하여 사용 가능한 상태로 되돌린다. 이 과정은 트랜잭션의 롤백이나 TRUNCATE TABLE 명령어 실행 시 발생할 수 있다.
페이지 할당 관리 (PFS, 페이지 사용 가능 공간: Page Free Space)
PFS(Page Free Space) 페이지는 SQL Server 데이터베이스에서 각 페이지의 공간 할당 상태와 사용 가능한 여유 공간을 기록한다. 페이지는 사용된 공간에 따라 1~50%, 51~80%, 81~95%, 96~100% 로 분류되어 기록되는데, 이 정보를 통해 데이터베이스 엔진은 새로운 데이터를 저장하기에 적합한 페이지를 효과적으로 식별할 수 있게된다. PFS 페이지는 데이터베이스 파일 내에서 파일 헤더 페이지 바로 다음에 위치하며, 그 이후로 약 64MB(8,000 페이지)마다 반복되어 배치된다.
객체 할당 관리 (IAM, 인덱스 할당 맵: Index Allocation Map)
IAM(Index Allocation Map) 페이지는 SQL Server에서 데이터베이스 객체(테이블, 인덱스 등) 가 사용하는 페이지의 할당 상태를 추적하고 관리한다. 데이터베이스 파일 내 4GB(약 64,000 익스텐트) 크기의 구간을 매핑하며, 해당 범위에 포함된 익스텐트 중 어떤 것들이 객체에 할당되었는지 나타낸다. 객체가 4GB를 초과하면 추가 IAM 페이지가 생성되어 IAM 체인을 형성하고, 이 체인은 연결 리스트 형태로 구성된다. IAM 페이지는 할당된 익스텐트의 시작 페이지 번호를 포함하여 위치 정보를 제공하고, 이를 통해 SQL Server는 데이터의 위치를 효율적으로 찾을 수 있게 된다. IAM 페이지는 테이블이나 인덱스의 데이터 저장 요구에 따라 할당되며, 파일 내에서 임의의 위치에 배치된다.
IAM 의 할당 단위의 유형은 다음 세 가지가 있다.
IN_ROW_DATA
테이블의 행 데이터가 저장되는 페이지를 나타낸다. 행 크기 제한(8KB) 내에서 저장될 수 있을 때 사용되는 할당 단위이다.
ROW_OVERFLOW_DATA
행 데이터가 페이지의 크기 제한(8KB)을 초과할 경우, 사용되는 할당 단위이다.
LOB_DATA
Large Object 데이터를 위한 할당 단위로, text, ntext, image, xml, varbinary(max), varchar(max), nvarchar(max) 등의 데이터 타입을 위한 페이지가 포함된다.
페이지 할당 관리 아키텍처
SQL Server 는 IAM 과 PFS 페이지를 아래 방식으로 사용하여 페이지의 할당 상태를 관리한다.
데이터베이스 엔진이 새로운 행을 삽입할 때, 먼저 기존 익스텐트에 충분한 공간이 있는지 확인한다. 충분한 공간이 있으면, 해당 익스텐트의 빈 페이지에 데이터를 저장한다. 만약, 공간이 부족하면 새로운 익스텐트를 할당하거나 사용 가능한 빈 페이지를 찾아 데이터 저장 공간을 확보한다. 이 과정에서 IAM 페이지를 통해 할당 단위에 할당된 익스텐트를 찾고, PFS 페이지를 검색하여 사용 가능한 페이지를 확인한다. IAM과 PFS 페이지는 SQL Server 버퍼 풀의 메모리에 적재되어 있어 빠른 검색이 가능하며, 이러한 과정은 데이터 저장 공간을 효율적으로 관리하고 데이터베이스 성능을 최적화하는 데 중요한 역할을 한다.
변경된 익스텐트 관리 (DCM, BCM)
1) DCM (차등 변경 맵: Differential Changed Map)
DCM(Differential Changed Map)은 마지막 BACKUP DATABASE 이후에 변경된 익스텐트를 추적한다. DCM 도 비트맵 형태로 각 익스텐트의 상태를 표시한다. 비트가 0이면 변경 사항이 없고, 1이면 변경된 익스텐트가 있음을 나타낸다. DCM은 차등 백업을 수행할 때 사용되며, 변경된 익스텐트의 유무를 확인하여 백업 프로세스의 효율을 높여준다.
2) BCM (대량 변경 맵: Bulk Changed Map)
BCM(Bulk Changed Map)은 마지막 BACKUP LOG 이후 대량 로깅 작업에 의해 수정된 익스텐트를 추적한다. 비트가 0이면 대량 로그 작업으로 인한 변경이 없고, 1이면 데이터 변경이 있음을 의미한다. BCM은 대량 로깅 복구 모델 (bulk-logged recovery model) 에서 사용되며, BACKUP LOG 수행 시 수정된 익스텐트를 스캔한다. 그런 다음 해당 익스텐트를 로그 백업에 포함시킨다. 이는 일련의 트랜잭션 로그 백업으로 복원할 때 대량 로깅 작업을 복구하는데 효율적인 복구를 도와준다.
DCM과 BCM 페이지는 GAM 및 SGAM 페이지 뒤에 위치하며, 이들 간의 간격도 각각 4GB마다 반복됩니다.
데이터 파일 내 시스템 페이지의 순서
File header -> PFS -> GAM -> SGAM -> BCM/DCM
페이지 위치 | 시스템 페이지명 | 설명 |
0 | File header | 데이터베이스 파일의 가장 첫 페이지에 위치 |
1 |
PFS | Filde Header 페이지 다음에 위치하며, 약 64MB (8,000 페이지) 마다 한번씩 반복하여 위치 |
2 |
GAM | PFS 페이지 다음에 위치하며, 약 4GB (64,000 익스텐트) 마다 한번씩 반복하여 위치 |
3 | SGAM | GAM 페이지 다음에 위치하며, 약 4GB (64,000 익스텐트) 마다 한번씩 반복하여 위치 |
4 |
BCM | SGAM 페이지 다음에 위치하며, 약 4GB (64,000 익스텐트) 마다 한번씩 반복하여 위치 |
5 | DCM | SGAM 페이지 다음에 위치하며, 약 4GB (64,000 익스텐트) 마다 한번씩 반복하여 위치 |
- | IAM | 최대 4GB 씩 매핑하며, 파일 내 임의의 위치에 배치 |
참고 문헌
'DBMS > SQL Server (MS-SQL)' 카테고리의 다른 글
[SQL Server / MS-SQL] ROW 모드와 BATCH 모드 (SQL 처리 방식) (0) | 2024.05.27 |
---|---|
[SQL Server / MS-SQL] 특정 테이블의 페이지 확인하기 (DBCC IND, DBCC PAGE) (0) | 2024.05.22 |
[SQL Server / MS-SQL] Generate Scripts 이용하여 DB 복사/이관하기 (0) | 2023.10.26 |
[SQL Server / MS-SQL] MI database properties error (subquery returned more than 1 value.) (0) | 2023.02.28 |
[SQL Server / MS-SQL] MS-SQL 에서 MySQL Linked Server 연결 (0) | 2022.09.15 |