user database的initial size和dbcc shrinkfile

之前我们讨论了dbcc shrinkfile改变tempdb initial size的情况。而用DBCC Shrinkfile去收缩一个user database,情况就比较简单了。让我们通过一些测试来说明SQL Server 收缩user database的行为。

首先创建了一个数据库,Sales_data的初始大小为3mb。 对于当前这个数据库文件来说,它的initial size为3mb。

CREATE DATABASE Sales

ON

( NAME = Sales_dat,

   FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008RTM\MSSQL\DATA\saledat.mdf',

    SIZE = 3,

    FILEGROWTH = 1 )

LOG ON

( NAME = Sales_log,

    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008RTM\MSSQL\DATA\salelog.ldf',

    SIZE = 5MB

) ;

现在我们插入一些10mb数据:

select top 1280 REPLICATE('a',8000)as x into a from sys.columns c1 ,sys.columns c2

 

Sales_data大小变成了13mb的左右,然后执行dbcc shrinkfile来收缩数据文件,注意这里我们没有指定要收缩到的target size:

我发现sales_data的大小变成了3mb。

结论: 当数据库实际使用的空间小于Minimum size时,在不指定 target size的情况下,dbcc shrinkfile可以将文件收缩到Minimum Size。(实际上在这个测试中的MinimumSize就是我们数据库的initial size。)

 

那么我们来看看dbcc shrinkfile能否改变user database的Minimum size? 继续下一个实验。

执行下面的脚本,先将数据库从3M变为13MB,然后使用dbcc shrink并指定target size为10MB。

收缩之后sales_dat变成了11mb,但Minimumsize仍然是之前的3mb。 那么是否说明dbcc shrinkfile无法改变user database的Minimum size? ? ?

继续进行试验:现在我们给dbcc shrinkfile命令指定target size为1MB。

试验结果是,数据库的当前大小变为1.3mb, 而且MinimumSize也变成1.3mb。

 

我们再次插入数据扩张数据库大小,之后再次使用dbcc shrinkfile收缩(不指定target size)。

 

如我们所料,这次数据库就被收缩到了1.3mb。

结论: 如果数据库收缩后的大小仍然大于minimum size,那么minimum size不会改变。 如果收缩后数据大小小于当前的minimum size,那么minimum size变更为当前大小。

 

虽然dbcc shrinkfile可以返回minimumsize,但是使用这种办法来查看minimum size显然不是个好主意。还有其他方法查看Minimum size吗?

答案是肯定的:

可以通过dbccfileheader得到文件的Minimum size, 请参考MinSize列。

Minimum size的值实际存储在数据文件的第0页中,所以我们通过dbcc page也能查看到