Я попытался понять, как SQL Server хранит Tinyint
(который должен быть длиной 1 байт).SQL Server: почему отчет «DBCC Page» «Tinyint» - 2 байта?
-- Create table
CREATE TABLE MyTest.dbo.TempTable
(
Col1 Tinyint NOT NULL
);
-- Fill it up
INSERT INTO dbo.TempTable VALUES (3);
-- Get page info
dbcc ind
(
'MyTest' /*Database Name*/
,'dbo.TempTable' /*Table Name*/
,-1 /*Display information for all pages of all indenxes*/
);
-- Get page data
dbcc traceon(3604)
dbcc page
(
'MyTest' /*Database Name*/
,1 /*File ID*/
,182 /*Page ID*/
,3 /*Output mode: 3 - display page header and row details */
)
Вот результат: выполнение
DBCC завершено. Если DBCC печатал сообщения об ошибках, обратитесь к системному администратору.
СТР (1: 182) ... ... ...
Слот 0 Смещение 0x60 Длина 9
Тип записи = PRIMARY_RECORD Запись атрибутов = NULL_BITMAP Record Size = 9
дамп памяти @ 0x000000000545A060
00000000000 00000: ††††††††††††††††† .........
Слот 0 Колонка 1 Смещение 0x4 Длина 2 Длина (физический) 2
Col1 = 3
DBCC исполнение завершено. Если DBCC печатал сообщения об ошибках, обратитесь к системному администратору.
Интерпретация: Фактическая строка данных 10 00 0600 0300 0100 00, как:
10: Статус биты A
00: Бит состояния B
0600: Позиция, где количество столбцов хранится
0300: данные TinyInt
0100: Количество колонке
00: Нулевой растровое
Всего байт: 1 + 1 + 2 + 2 + 2 + 1 = 9 байт
По сравнению с «» SMALLINT:
изменяющий тип «COL1» к «
Smallint
» (который 2 байта в длину), полученного
точно тот же результат.
Вопрос Почему SQL Server выделяет 2 байта на столбец «
Tinyint
»? Почему он не различает «Tinyint» и «Smallint» в размере магазина?
дополнительный байт можно отнести к Null bitmap ... больше объяснений здесь: http://dba.stackexchange.com/questions/14774/sql-server-storage-of-tinyint – nshah
Еще лучше, см. Параграф «Самый маленький размер строки» http://jongurgul.com/blog/sql-server-row-internals/ – nshah
@nshah Ваш второй комментарий - это ответ. Это все о минимальном размере строки (9 байтов) и дополнении. Я хотел, чтобы вы разместили его как ответ, чтобы я мог выбрать его как лучший ответ. В любом случае, большое вам спасибо. – Alireza