sqlserver 大字段存储格式(二)

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的页里面指针指向的是具体的数据页,里面包含了具体的数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值