SQL Server:为什么'DBCC Page'报告'Tinyint'是2个字节?

时间:2015-04-07 19:58:41

标签: sql-server architecture dbcc

我试图弄清楚SQL Server如何存储Tinyint(应该是1个字节长)列。

-- 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打印了错误消息,请与系统管理员联系。

PAGE:(1:182) ... ... ...

Slot 0 Offset 0x60 Length 9

记录类型= PRIMARY_RECORD记录属性= NULL_BITMAP 记录大小= 9

内存转储@ 0x000000000545A060

<00> 0000000000000000: 10000600 03000100 00 †††††††††.........

插槽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字节

与&#39; Smallint&#39;:相比较 改变Col1&#39;输入&#39; Smallint&#39; (长度为2个字节)产生完全相同的结果。

问题 为什么SQL Server将2个字节专用于&#39; Tinyint&#39;柱?为什么它没有区分&#39; Tinyint&#39;和&#39; Smallint&#39;在商店大小?

1 个答案:

答案 0 :(得分: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