當你在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了。