当你在SqlServer创建数据库的时候可以指定数据库文件的初始大小,比如下图中我们将新创建的数据库MyDB的大小设置成了1024MB
那么你建好的数据库的确也就会占用1024MB左右的磁盘空间
不过使用存储过程sp_spaceused可以看到其中有1021.85 MB的空间是MyDB占用着并未使用。
于是我们在想是不是可以用DBCC ShrinkDatabase或DBCC ShrinkFile语句收缩未使用的数据库空间
dbcc shrinkdatabase('MyDB',10)
但是执行Shrink语句后我们发现数据库大小没有丝毫变化。。。
并且在执行Shrink语句后得到提示
这说明Sqlserver认为MyDB没有空间可以收缩。。。但是实际上我们通过存储过程sp_spaceused可以看到MyDB的确是有1021.85 MB的空间是没使用的。不能收缩数据库的原因其实是新建SqlServer数据库的时候指定的初始大小是不能被收缩掉的,要使用Alter Database语句或者在SMSS中重新指定MyDB的初始大小才能够收缩未使用的空间。
现在我们在SMSS中将MyDB的初始大小更改为800MB
可以看到现在MyDB的大小的确是在800MB左右了
然后现在再把MyDB的初始大小改回1024MB
然后此时再执行dbcc shrinkdatabase('MyDB',10),可以看到数据库大小变为了800MB左右,所以实际上shrinkdatabase语句只能把数据库收缩为 自数据库创建之初以来指定过的最小的初始文件大小,如果你的数据库第一次创建的时候初始大小就是1024MB,并且之后都没有人为调动过初始大小那么抱歉你的数据最小也就只能收缩到1024MB,尽管可能其中有1023MB都没有被实际用到。。。
数据库文件组中的NDF文件可能需要用Sql语句来指定文件初始大小
有时候在SqlServerManagementStudio中使用UI界面来指定NDF文件大小可能会不起作用,比如下图中我们可以看到tempdb数据库除了主数据库文件tempdb.mdf外,还有7个ndf文件。在下面的UI窗口中指定tempdb.mdf的文件初始大小是没有问题的,但是在指定tempdb_6.ndf的初始大小的时候没有效果。
这时我们使用下面的Sql语句来更改tempdb_6.ndf文件的初始大小就行了。该语句实际上可以更改数据库文件组下任何文件的初始大小。
ALTER DATABASE tempdb MODIFY FILE (NAME='tempdb_6'/*这里写ndf文件的逻辑名称,在上图中tempdb_6.ndf文件的逻辑名称就是tempdb_6*/,SIZE=200MB/*指定ndf文件的初始大小*/,MAXSIZE=UNLIMITED,FILEGROWTH=100MB);
执行上面语句后再查看tempdb_6.ndf文件的初始大小就变成200MB了。