8KB로 이루어진 페이지는 이중에서 96바이트가 페이지 헤더로 사용되고, 나머지는 데이터를 저장한다고 하였다. 그럼 실제 페이지의 모습이 어떤지를 살펴보자.

데이터 페이지는 text, ntext, image와 같은 BLOB(Big Large Objects)형의 대형 데이터들을 제외한 모든 데이터들을 저장할 수 있다. BLOB데이터들은 데이터의 크기가 매우 크기 때문에 8KB의 제한을 가지는 일반 데이터페이지들은 저장할 수 없으며, 별도의 페이지에 저장된다.
페이지 헤더 영역은 각 페이의 앞/뒤 노드(Node)들에 대한 페이지 포인터 값을 가지고 있는데, 이는 자료구조에서 링크드 리스트(Linked List) 구조로 되어 있다. 앞에 노드가 없으면 null값을 가지며 앞의 노드나 뒤의 노드가 있으면 그 노드의 포인터 값들이 페이지 헤더에 저장된다.
Data Row영역은 실제 데이터가 저장된다. 그림에서는 Data Row1과 Data Row2가 존재하고 있지만, 어떤 경우에는 하나의 데이터 로우가 페이지 전체를 사용할 수도 있다.
그 다음에 위치하는 것은 데이터 로우 및 페이지 헤더가 8KB의 데이터 페이지를 모두 사용하지 않았다면 아직 사용되지 않고 남아 있는 여유 공간이 된다. 인덱스 페이지에 보면 Fill Factor라는 것이 있다. 데이터 업데이트 작업이 빈번하게 일어나는 테이블의 경우에 인덱스의 성능 향상을 위해 일부러 페이지에 여유 공간을 두는 것인데, 이때 남아 있는 여유 공간이 바로 이덱스 페이지 Free Space이다.
이 공간을 모두 채워서 쓰게 되면 새로운 데이터를 추가할 때마다 새로운 인덱스 페이지를 생성하게 되므로(페이지 스플릿), 인덱스 페이지 생성에 너무 많은 비용이 소요된다.
여유 공간의 마지막에는 로우 오프셋(Row Offset)이 존재한다. 오프셋은 단어 그대로 각 행의 첫째 바이트가 페이지의 시작에서 얼마나 떨어져 있는가 하는 위치 값을 가지고 있으며, 데이터 로우의 순서와는 반대로 끝에서부터 저장된다.
참고서적:Deep Inside T-SQL