다음 테이블을 만들었습니다.
CREATE TABLE dbo.TestStructure
(
id INT NOT NULL,
filler1 CHAR(36) NOT NULL,
filler2 CHAR(216) NOT NULL
);
그런 다음 클러스터형 인덱스를 만들었습니다.
CREATE CLUSTERED INDEX idx_cl_id
ON dbo.TestStructure(id);
다음으로 각 크기가 256 바이트 인 30 행으로 채 웁니다 (테이블 선언에 따라).
DECLARE @i AS int = 0;
WHILE @i < 30
BEGIN
SET @i = @i + 1;
INSERT INTO dbo.TestStructure (id, filler1, filler2)
VALUES (@i, 'a', 'b');
END;
이제 "훈련 키트 (시험 70-461) : Microsoft SQL Server 2012 쿼리 (Itzik Ben-Gan)"책에서 읽은 정보를 바탕으로합니다.
SQL Server는 내부적으로 데이터 파일의 데이터를 페이지 단위로 구성합니다. 페이지는 8KB 단위이며 단일 객체에 속합니다. 예를 들어, 테이블이나 인덱스. 페이지는 읽고 쓰는 가장 작은 단위입니다. 페이지는 추가 범위로 구성됩니다. 익스텐트는 8 개의 연속 페이지로 구성됩니다. 익스텐트의 페이지는 단일 객체 또는 여러 객체에 속할 수 있습니다. 페이지가 여러 객체에 속하는 경우 범위를 혼합 범위라고합니다. 페이지가 단일 객체에 속하는 경우 범위를 균일 한 범위라고합니다. SQL Server는 개체의 처음 8 페이지를 혼합 된 범위로 저장합니다. 개체가 8 페이지를 초과하면 SQL Server는이 개체에 대해 추가로 균일 한 범위를 할당합니다. 이 구성을 사용하면 작은 개체는 공간을 덜 차지하고 큰 개체는 조각화가 줄어 듭니다.
그래서 여기에 7680 바이트로 채워진 첫 번째 혼합 범위 8KB 페이지가 있습니다 (256 바이트 크기 행을 30 배 삽입하므로 30 * 256 = 7680). 크기 검사 proc을 실행 한 크기를 확인하려면 다음 결과를 반환합니다.
index_type_desc: CLUSTERED INDEX
index_depth: 1
index_level: 0
page_count: 1
record_count: 30
avg_page_space_used_in_percent: 98.1961947121324
name : TestStructure
rows : 30
reserved : 16 KB
data : 8 KB
index_size : 8 KB
unused : 0 KB
따라서 16KB는 테이블 용으로 예약되어 있으며 첫 8KB 페이지는 Root IAM 페이지 용이고, 두 번째는 8KB의 리프 데이터 스토리지 페이지 용으로 ~ 7.5KB를 점유하고 256 바이트의 새 행을 삽입 할 때 다음과 같습니다.
INSERT INTO dbo.TestStructure (id, filler1, filler2)
VALUES (1, 'a', 'b');
256 바이트의 공간 (7680 b + 256 = 7936, 여전히 8KB보다 작음)이지만 동일한 페이지에 저장되지 않고 새 데이터 페이지가 작성되지만 새 행이 동일한 이전 페이지에 맞을 수 있습니다 , SQL Server가 공간을 절약하고 검색 시간을 기존 페이지에 삽입 할 때 새 페이지를 만드는 이유는 무엇입니까?
참고 : 힙 인덱스에서도 마찬가지입니다.