视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
SQLServer解析行溢出数据的存储
2020-11-09 13:41:21 责编:小采
文档


SQL Server2000中最大数据行的大小为8060(我们可以使用的大小为8039),即创建表时所有列的大小总和不能超过8060。在2005中,对于定长的数据,依然保留了这个(不过在2005中,我们可以使用的大小为8053,而不是8039)。那么在SQL SERVER2005中对于一行是不

  SQL Server2000中最大数据行的大小为8060(我们可以使用的大小为8039),即创建表时所有列的大小总和不能超过8060。在2005中,对于定长的数据,依然保留了这个(不过在2005中,我们可以使用的大小为8053,而不是8039)。那么在SQL SERVER2005中对于一行是不是只能存储最多8053字节的数据呢?能不能突破8060的这个呢?

  在SQL SERVER2000中没有办法,但是在SQL SERVER2005中,是有可能的。在SQL SERVER2005使用变长数据,可以突破8060的。因为SQL SERVER2005中对数据每行记录的做了一定的调整,对于包含变长类型的表,每一列的长度仍然必须在每行8000以内,但是它们的合并宽度可以超过8060B的。

  在SQL SERVER2005中,可以把变长列存储在行溢出页面。当一个列需要从一个常规页面转移到一个行溢出页面时,,SQL 2005会保留一个包含行溢出信息的指针作为原始记录的一部分,指针的大小为24B,并且对于每个变长列,无论该列是否存储在记录中,记录还需要2个字节。

  【测试】

  create table tb(col char(7000),col2 varchar(3000),col3 varchar(3000))

  go

  insert into tb

  values('aaa',replicate('bbb',1000),replicate('ccc',1000))

  go

  dbcc ind(test,tb,-1) -–得到的页面号为,80,6321,6315.其中,6321为IAM页,80与6315为数据页

  dbcc traceon(3604)

  dbcc page(test,1,,1)

  dbcc page(test,1,80,1)

  dbcc page(test,1,6321,1)

  dbcc page(test,1,6315,1)

  下面分别解析所生成的IAM页与数据页,就可以看到行溢出数据在SQL SERVER2005中是如何来进行存储的。

  一、解析IAM页

  因为与6321页面结构是相同的,解析其中的第一即可,以页为例。

  dbcc traceon(3604)

  dbcc page(test,1,,1)

  得到的结果:

  1、 该页面总共两行

  2、 第一行记录了该IAM记录的数据页(后面的注释说明了该数据的作用)

  00000000: 00005e00 00000000 00000000 00000000 †--该行的长度

  00000010: 00000000 00000000 00000000 00000000 †...............

  00000020: 00000000 00000000 00000000 01005000 †--负责的数据页面id

  00000030: 00000100 00000000 00000000 00000000 †...............

  二、解析数据页

  1、 解析80页面数据:

  00000000: 30005c1b 61616120 20202020 20202020 –-前四个字节就不解释了

  ……

  00001B50: 20202020 20202020 20202020 0300f802

  -–0300总共有三列,f8 null位图,0200变长列有两列

  00001B60: 007d9b95 9b020000 65010000 00f65c00

  --虽然第二列和第三列的数据存储在另外的数据页,但每个列依然会占用两个字节。

  00001B70: 00b80b00 00ab1800 00010000 00020000

  00001B80: 65010000 00c04700 00b80b00 00ab1800

  00001B90: 00010001 00

  020000 65010000 00f65c00 00b80b00 00ab1800 00010000 00

  第一个行溢出的指针

  020000 65010000 00c04700 00b80b00 00ab1800 00010001 00

  第二个行溢出的指针

  一个长度为24字节的指针。24字节包含的部分分别如下:

0200

00

65

01000000

f65c0000

B80b0000

ab180000

0100

0000

溢出列类型

在B-树种的层次

暂时不用,无实际意义

Lob数据更新的次数

用于dbcc checktable使用的一个随机值,在lob存在的周期中不会改变

该列的长度。

(计算时为00000bb8)

该部分数据所在的页面号

该部分数据所在的文件号

该部分数据所在页面中的slot号

  2、对于行溢出页面,使用的页面类型为LOB。对于该页面的记录方式,以后再进行叙述。

下载本文
显示全文
专题