• 解析行溢出数据的存储


    /***************************************************  

              作者:herowang(让你望见影子的墙)

         日期:2009.12.27

              注:    转载请保留此信息

         更多内容,请访问我的博客:blog.csdn.net/herowang

    ****************************************************/

     

    解析行溢出数据的存储

    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) -–得到的页面号为898063216315.其中896321IAM页,806315为数据页

    dbcc traceon(3604)

    dbcc page(test,1,89,1)

    dbcc page(test,1,80,1)

    dbcc page(test,1,6321,1)

    dbcc page(test,1,6315,1)

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

    一、解析IAM

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

    dbcc traceon(3604)

    dbcc page(test,1,89,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。对于该页面的记录方式,以后再进行叙述。

  • 相关阅读:
    到底有多少种智能指针(smart pointer)
    QSettings提供了非常方便的注册表读写
    阿里腾讯亿元级投资版图:阿里爱买超市,腾讯娱乐至上(恐怖)
    gcc安装教程(学习Linux编程只需安装cygwin)
    苹果抛弃的芯片公司Imagination被中资49亿溢价收购
    NET Core2
    HelloWorld RabbitMQ
    redis 集群
    kafka
    Impala简介PB级大数据实时查询分析引擎
  • 原文地址:https://www.cnblogs.com/trieagle/p/1634069.html
Copyright © 2020-2023  润新知