求高手给力的解释--关于数据文件
Kandy 2011-08-24 01:14:07 在用SQL进行的生产环境中,单个数据库主文件MDF已经到达20多G,考虑进行文件分组管理,测试机用备份恢复一个实例,在管理界面中随意建立了几个文件组和一些测试文件,并且更改了默认数据组,在做完操作确定的瞬间数据文件的分布发生了改变,结果如下:
---------------------------------------------
HO_DATA E:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\HO_0621.MDF
640 64000 PRIMARY 0
menzhen E:\menzhen.ndf 1024 10 menzhen 0
test1 E:\test1.ndf 5120 10 PRIMARY 0
test2 E:\test2.ndf 5120 10 PRIMARY 0
test3 E:\test3.ndf 5120 10 PRIMARY 0
test4 E:\test4.ndf 5120 10 PRIMARY 0
test5 E:\test5.ndf 5120 10 PRIMARY 0
test6 E:\test6.ndf 5120 10 test 1
goo E:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\goo.ndf
0 10 gg 0
--------------------------------------------------
从上边的数据可以看出,主文件从原来的20多G变成了600多M,而其他建立的5G大小的PRIMARY和TEST文件组中的文件基本平均分布了数据,按照单个文件收缩看了一下,每个数据文件均占用了80%左右的空间.
按照MS的官方解释,如果在数据库中创建对象时没有指定对象所属的文件组,对象将被分配给默认文件组。不管何时,只能将一个文件组指定为默认文件组。默认文件组中的文件必须足够大,能够容纳未分配给其他文件组的所有新对象。PRIMARY 文件组是默认文件组,除非使用 ALTER DATABASE 语句进行了更改。但系统对象和表仍然分配给 PRIMARY 文件组,而不是新的默认文件组。
很明显的,在上边的测试结果中主数据文件的大小发生了改变,但应该不是所谓的只有系统对象和表,因为系统对象和表是分配给PRIMARY文件组的,奇怪的是数据为什么看起来似乎是平均得分配到了每个数据文件中,而且在随后的测试中仿照之前的操作步骤对另外恢复的数据库无论如何都没有重现这种测试结果.
在上边的测试结果操作的过程中并未进行DBCC SHRINKFILE(XX,EMPTYFILE)之类的操作,但这种情况为什么会发生,怎么发生的?因为这种情况恰恰是解决单个数据文件过大,提高IO及并行操作的解决方案,在生产环境中并没有时间去等待进行DBCC SHRINKFILE(XX,EMPTYFILE)之类的操作,也不大现实去在生产中移动一些表到不同的数据文件并且重建索引等操作.
求解!