2015-04-07 3 views
2

Я попытался понять, как 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» в размере магазина?

+0

дополнительный байт можно отнести к Null bitmap ... больше объяснений здесь: http://dba.stackexchange.com/questions/14774/sql-server-storage-of-tinyint – nshah

+1

Еще лучше, см. Параграф «Самый маленький размер строки» http://jongurgul.com/blog/sql-server-row-internals/ – nshah

+0

@nshah Ваш второй комментарий - это ответ. Это все о минимальном размере строки (9 байтов) и дополнении. Я хотел, чтобы вы разместили его как ответ, чтобы я мог выбрать его как лучший ответ. В любом случае, большое вам спасибо. – Alireza

ответ

1

Попытайтесь найти выход DBCC PAGE WITH TABLERESULTS.

Когда я поставил в два ряда, один со всеми 0 и один со всеми 1, я могу ясно видеть, поле TINYINT использует только один байт:

CREATE TABLE dbo.SpaceTest 
    (
     biggest BIGINT , 
     medium INT , 
     small SMALLINT , 
     tiny TINYINT 
    ) 
INSERT INTO dbo.SpaceTest 
     (biggest, medium, small, tiny) 
VALUES (0, 0, 0, 0), 
     (1, 1, 1, 1) 

--Get a list of pages used by the table 
DBCC IND('Sandbox', 'SpaceTest',0) 

Output of DBCC IND

DBCC TRACEON (3604); 
DBCC PAGE (Sandbox,1,42823,3) WITH tableresults; 
GO 

enter image description here

+0

Ваш случай производных от моего вопроса настолько, что не может рассматриваться как встречный пример. Речь идет о минимальном размере строки и дополнении. См. [Link] (http://jongurgul.com/blog/sql-server-row-internals). – Alireza

+1

Я вижу это, спасибо за ссылку. –

Смежные вопросы