Недостающие байты на странице данных SQL Server

Не знал, как правильно назвать название. Тем не менее, я пытаюсь понять, как хранятся страницы данных. Я создал простую таблицу:

CREATE TABLE testFix
(
 id INT,
 v CHAR(10)
);

INSERT INTO dbo.testFix
(
    id,
    v
)
VALUES
(   1, -- id - int
    'asdasd' -- v - varchar(100)
) 
GO 2
DBCC TRACEON(3604);

Затем я получил PageFID и PagePID с помощью следующей команды:

DBCC IND(tempdb, testFix, -1)
GO

Тогда фактические данные страницы:

DBCC PAGE (tempdb, 1, 368, 3) 

Итак, теперь я вижу:

Слот 0 Смещение 0x60 Длина 21

Тип записи = PRIMARY_RECORD Атрибуты записи = NULL_BITMAP
Размер записи = 21

Дамп памяти @ 0x000000287DD7A060

0000000000000000: 10001200 01000000 61736461 73642020 20200200........ asdasd.. 0000000000000014: 00
,

Слот 0 Колонка 1 Смещение 0x4 Длина 4 Длина (физическая) 4

id = 1

Слот 0 Колонка 2 Смещение 0x8 Длина 10 Длина (физическая) 10

v = asdasd

Слот 1 Смещение 0x75 Длина 21

Тип записи = PRIMARY_RECORD Атрибуты записи = NULL_BITMAP
Размер записи = 21

Дамп памяти @ 0x000000287DD7A075

0000000000000000: 10001200 01000000 61736461 73642020 20200200........ asdasd.. 0000000000000014: 00
,

Слот 1 Колонка 1 Смещение 0x4 Длина 4 Длина (физическая) 4

id = 1

Слот 1 Колонка 2 Смещение 0x8 Длина 10 Длина (физическая) 10

v = asdasd

Слот 2 Смещение 0x8a Длина 21

Тип записи = PRIMARY_RECORD Атрибуты записи = NULL_BITMAP
Размер записи = 21

Дамп памяти @ 0x000000287DD7A08A

0000000000000000: 10001200 01000000 61736461 73642020 20200200........ asdasd.. 0000000000000014: 00

Таким образом, длина записи составляет 21 байт. Однако INT составляет 4 байта, а CHAR(10) - 10 байтов. 4+10=14. Для чего используются остальные 7 байтов?

1 ответ

Решение

Вот "анатомия" строки данных

В красном есть 7 байтов, которые вам не хватает: Биты состояния A (1), Биты состояния B (1), Длина Fdata (2), Ncols (2), NullBits (1)

Из этой книги: Pro SQL Server Internals by Короткевич Д.

Другие вопросы по тегам