Недостающие байты на странице данных 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 Короткевич Д.