SQL Server数据页

时间:2017-07-18 07:40:54

标签: sql-server dbcc data-paging

不知道如何正确调用标题。但是,我试图了解数据页面的存储方式。我创建了简单的表格:

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) 

现在我看到了:

  

Slot 0 Offset 0x60 Length 21

     

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

     

内存转储@ 0x000000287DD7A060

     

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

     

插槽0列1偏移0x4长度4长度(物理)4

     

id = 1

     

Slot 0 Column 2 Offset 0x8 Length 10 Length(physical)10

     

v = asdasd

     

Slot 1 Offset 0x75 Length 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

     

Slot 2 Offset 0x8a Length 21

     

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

     

Memory Dump @ 0x000000287DD7A08A

     

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

所以记录的长度是21个字节。但是INT是4个字节而CHAR(10)是10个字节。 4 + 10 = 14。其他7个字节的用途是什么?

1 个答案:

答案 0 :(得分:2)

这是数据行的“解剖”

enter image description here

红色表示您缺少7个字节:状态位A(1),状态位B(1),Fdata长度(2),Ncols(2),NullBits(1)

从这本书:Pro SQL Server Internals by Korotkevitch D.