首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

Alter修改表结构对数据存储的影响(二),该怎么解决

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

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的行,恰好都是从第一页分出来的数据。然后结合上面的二进制数据,似乎可以得到这个结果:

1)、没有分离的数据,那么在后面加上一个新列,长度为修改后的列的长度

1996=7+4+985+1000;



2)、而被分离的数据,除了加上新列,还有在后面加上一个长度为14字节的数据,至于这14个字节做的作用,在后文中会进行交代。

五、总结:

1、修改表的时候,并不是扩充原来列的存储空间,而是在表的后面增加一个新的列

2、增加了新列后,可能会引起数据的分页。如果原来的数据不分页的话,那么数据就整体向后移动。如果要分页的话,那么最后一页的数据,向后移动后,前面就留有空间,先向最后一页的空闲空间写数据,如果写不下,则分配新的数据页,来存储数据。

3、如果数据进行分页后,对于没有分离的数据,那么在后面增加一个新列;对于分离的数据,除了增加一个新列外,还额外增加14字节的数据

这样,我们基本上就能估算出,修改表,需要的存储空间上的开销了(只能是大概的,因为对于分离的数据,在原来的数据页上还会保留9个字节空间,对于分页后的数据后面还有14个字节的空间),修改表结构后,存储每行数据需要的空间为:7+4+1985+2=1998B

这样每页最多只能存储4行数据。

 如果该表的数据量很大的话,这个开销就会很大,我们是不能忽视这个开销的。

 

六、解决方法:


上有政策,下有对策。本方法实际的实际可行性,没有验证。(没有生产环境,不好测试)。

1、 新建一张表,当然是修改结构后的表

2、 Insert into tb2 Select * from tb1

3、 重命名tb2为tb1




[解决办法]
BD
[解决办法]
学习
[解决办法]
.
[解决办法]
。。。
[解决办法]

[解决办法]
越来越有深度了
[解决办法]
影哥 一直是个 好老师
[解决办法]

探讨
引用:
越来越有深度了

后面还有呢。嘿嘿

[解决办法]
探讨
引用:
引用:
越来越有深度了

后面还有呢。嘿嘿

。。。其实一直想问 影子老师到底是什么老师?

[解决办法]
探讨
引用:
引用:
引用:
越来越有深度了

后面还有呢。嘿嘿

。。。其实一直想问 影子老师到底是什么老师?

培养DBA
的sql老师

[解决办法]
这是个很实用的东西,不错,好
[解决办法]

[解决办法]
好,顶起!
[解决办法]
强帖留名.
[解决办法]
o。。。。oo。。。不错哦
[解决办法]
oo。。。不错哦
[解决办法]
感谢分享!
[解决办法]
哦..不错...小F推荐,必属精品
[解决办法]
有深度,继续。

[解决办法]
~~~~~~~~~~
[解决办法]
学习了.
[解决办法]
顶起.
[解决办法]
mx,m,.xm
[解决办法]
我先收藏起来,以后慢慢看,谢谢楼主
[解决办法]
学习
------解决方案--------------------


学习
[解决办法]
太难了.
[解决办法]
支持并学习
[解决办法]
xx
[解决办法]

探讨
sf不留

[解决办法]
探讨
引用:
引用:
越来越有深度了

后面还有呢。嘿嘿

。。。其实一直想问 影子老师到底是什么老师?

[解决办法]
越来越觉得自己是白痴。
[解决办法]

[解决办法]
谢谢分享
[解决办法]
惊讶!
[解决办法]
先收下,以后慢慢看。
[解决办法]
有点不明白
[解决办法]

[解决办法]
学习。。。
[解决办法]
学习了
[解决办法]
学习
[解决办法]
学习
[解决办法]
不错,学习中
[解决办法]
大侠就是大侠.内功淳厚.向你学习.
[解决办法]
内容好长。。
[解决办法]
学习
[解决办法]
收下了哦

热点排行