0

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

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

编号 = 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

编号 = 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 个字节的用途是什么?

4

1 回答 1

2

这是数据行的“解剖”

在此处输入图像描述

红色部分缺少 7 个字节:Status Bits A (1)、Status Bits B (1)、Fdata length (2)、Ncols (2)、NullBits (1)

摘自本书:Korotkevitch D. Pro SQL Server Internals。

于 2017-07-18T08:00:00.667 回答