日期:2014-05-18  浏览次数:20451 次

Alter修改表结构对数据存储的影响(二)
详情请访问我的blog:http://blog.csdn.net/HEROWANG/archive/2009/12/04/4940077.aspx

接上一篇:


Alter修改表结构对数据存储的影响(一)http://blog.csdn.net/HEROWANG/archive/2009/11/27/4890343.aspx


四、查看修改表结构后的页面数据

alter table tb

alter column col char(1000)

DBCC IND(test,tb,0)  
 

DBCC TRACEON(3604)

DBCC PAGE(test,1,114,1)

结果:(只关注这里要用到的数据)

DATA:

Slot 0, Offset 0x60, Length 9, DumpStyle BYTE

00000000: 04af0000 00010002 00 –第一行的数据

 

Slot 1, Offset 0x69, Length 1996, DumpStyle BYTE

00000000: 1000c907 02000000 62626262 20202020 ?........bbbb  

……

000003E0: 20626262 62202020 20202020 20202020 ? bbbb  

……  

000007C0: 20202020 20202020 200300f8 

 

观察这里的数据,我们会发现这么两个问题:

1、第一行数据slot 0 去哪儿了?怎么只剩下9个字节?

2、第二行数据slot 1,长度 length 为什么是1996,而不是上面计算的1013呢?

  仔细看下第二行的数据,就会发现bbbb出现了两次,所以1996是在原来的基础上,再加了1000,即当我们修改表的时候,并不是修改列的空间,而是在每一行后面增加新的一列。所以1996=7+4+985+1000。而倒数第三个字节也说明了这一点:0300 说明该表现在有三列,而不是原来的两列。

第一个问题暂时保留,接着往下看,就会发现答案

 

DBCC PAGE(test,1,175,1)(第二个数据页)

结果:

DATA:

Slot 0, Offset 0x1014, Length 1996, DumpStyle BYTE

1000c907 09000000 69696969 20202020 ?........iiii  

……

20202020 20202020 200300f8 

 

Slot 1, Offset 0x17e0, Length 1996, DumpStyle BYTE

1000c907 0a000000 6a6a6a6a 20202020 ?........jjjj  

……

20202020 20202020 200300f8  

 

Slot 2, Offset 0x60, Length 2010, DumpStyle BYTE

3200c907 01000000 61616161 20202020 ?2.......aaaa  

……  

20202020 20202020 200300f8 0100da87 ? .......  

00047200 00000100 0000

 

Slot 3, Offset 0x83a, Length 2010, DumpStyle BYTE

3200c907 03000000 63636363 20202020 ?2.......cccc  

20202020 20202020 200300f8 0100da87  

00047200 00000100 0200

 

OFFSET TABLE:(第二页的行偏移)

Row - Offset  

3 (0x3) - 2106 (0x83a)  

2 (0x2) - 96 (0x60)  

1 (0x1) - 6112 (0x17e0)  

0 (0x0) - 4116 (0x1014)  

 

观察这里的数据:上面的第一个问题视乎找到了答案。

1、 因为第一页的数据需要分页,所以就把第一行的数据和第三行数据,放到了第二个页。

而第一页的其他两行数据因为第二页放不下,所以放在第三页中。

2、 第三行也就是slot2,存储的恰好就是从第一页分出来的aaaa这一行的数据,但是为什么它的偏移是96,也就是说在第二数据页的第一行存储的是aaaa,而不是原来的iiii。

原因:当我们修改表的结构,会把原来的数据向后移动,这样原来的空间就空出来。这个时候,把从第一页分离出来的数据,就写到第二页里面,这样,aaaa恰好写在第一页,所以他的偏移为96,而原来的iiii和jjjj反而不在原来的地方。

如下图所示:




接着往下看:

DBCC PAGE(test,1,45,1)

DATA:

Slot 0, Offset 0x452, Length 2010, DumpStyle BYTE

00000000: 3200c907 05000000 65656565 20202020 .......eeee  

……

000007C0: 20202020 20202020 200300f8 0100da87  

000007D0: 00047200 00000100 0400

 

Slot 1, Offset 0x101e, Length 2010, DumpStyle BYTE

00000000: 3200c907 07000000 67676767 20202020.......gggg

……

000007C0: 20202020 20202020 200300f8 0100da87  

000007D0: 00047200 00000100 0600  

……

OFFSET TABLE:

Row - Offset (第二页的行偏移)  

1 (0x1) - 4126 (0x101e)  

0 (0x0) - 1106 (0x452)  

 

最后的几个问题:

1、综合观察上面的数据,有些行的长度为1996,而有些行的长度为2010。而长度为2010的行,恰好都是从