lob数据单行的存储格式
lob数据页的测试方法遵循上一篇overflow相同的方法:
- 测试脚本:
create table dbo.hugerows
(
a varchar(80),
b nvarchar(max),
c varchar(80),
d varchar(80)
);
insert into dbo.hugerows
select replicate('a',30), replicate('b',251658240),--30M
replicate('c',30),replicate('d',30);
--确认SQLServer是否在行溢出数据页中存储某个特殊表中的数据
select object_name(object_id) as name,
partition_id, partition_number as pnum, rows,
allocation_unit_id as au_id, type_desc as page_type_desc,
total_pages as pages
from sys.partitions p join sys.allocation_units a
on p.partition_id = a.container_id
where object_id=OBJECT_ID('dbo.hugerows')
dbcc ind (Simple, hugerows, -1)
DBCC TRACEON (3604);
dbcc page ('Simple', 1, 2197, 3)
page(2179)
0000000000000000: 3000040004000004 002f0053 8071008f 00616161 0......../.S.q...aaa
0000000000000014: 6161616161616161 61616161 61616161 61616161 aaaaaaaaaaaaaaaaaaaa
0000000000000028: 6161616161616104 00003c01 00000002 44000068 aaaaaaa...<.....D..h
000000000000003C: 1f000094 08000001 00000080 3e00008f 08000001 ............>.......
0000000000000050: 00000063 63636363 63636363 6363636363636363 ...ccccccccccccccccc
0000000000000064: 6363636363636363 63636363 63646464 64646464 cccccccccccccddddddd
0000000000000078: 6464646464646464 64646464 64646464 64646464 dddddddddddddddddddd
000000000000008C: 646464 ddd
lob数据页和overflow数据页差不多,中间也是存的一个指向lob页的指针:
前12个字节和overflow指针格式一样,而后面多了一些,并且后面页面的长度是总长度,是前几个页面(包括当前页面)之和。
注:中间红色的文件编号和槽编号目前没有可靠依据
lob tree数据页
- 测试方法遵循overflow相同的方法:
测试脚本:
create table dbo.hugerows
(
a varchar(80),
b nvarchar(max),
c varchar(80),
d varchar(80)
);
declare @A nvarchar(max)
set @A=replicate(CONVERT(nvarchar(max),'1'),POWER(2,28)); --128M
insert into dbo.hugerows
select replicate('a',30), @A,
replicate('c',30), replicate('d',30);
1. dbcc ind (Simple, hugerows, -1):
我们来看Page Type 为1的页面,存储格式和上面的lob数据一样,存放了一个lob指针,页为BLOB Inline Root,level为2,指向1:2170页
2. 而2170页格式是这样的:
PAGE: (1:2170)
. . . . . . //此处省略96字节的页头信息
Blob row at: Page (1:2170) Slot 0 Length: 2164 Type: 2 (INTERNAL)
Blob Id: 209387520 Level: 1 MaxLinks: 501 CurLinks: 134
Child 0 at Page (1:2187) Slot 0 Size: 4020000 Offset: 4020000
Child 1 at Page (1:2188) Slot 0 Size: 4020000 Offset: 8040000
Child 2 at Page (1:2189) Slot 0 Size: 4020000 Offset: 12060000
. . . . . .
Child 132 at Page (1:64478) Slot 0 Size: 4020000 Offset: 534660000
Child 133 at Page (1:64479) Slot 0 Size: 2210912 Offset: 536870912
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
3. 上图显示了页的数据信息,除了96字节的头信息后,紧接着是紫色框里的20个字节的信息:存放的是此图上面标黄的两行此页所存的lob页面信息总览;maxlinks表示此页可以存多少指针链接,curlinks表示此页已经存了多少,level是b树中级别,此页级别为1,所以属于中间节点,每个链接指向的一页是叶节点;指针格式如下
4. 而紧接着这20字节指针后面的一个个16字节的指针,便是具体的每个链接,包含页偏移,和页号,格式如下:
5. 上面一页的链接指向叶节点的一个链接页的格式和上面相同,只不过level为0,而这level0的页里面指针指向的是具体的数据页,里面包含了具体的数据。