之前我們討論了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,但Minimum size仍然是之前的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可以返回minimum size,但是使用這種辦法來檢視minimum size顯然不是個好主意。還有其他方法檢視Minimum size嗎?
答案是肯定的:
可以透過dbcc fileheader得到檔案的Minimum size, 請參考MinSize列。
Minimum size的值實際儲存在資料檔案的第0頁中,所以我們透過dbcc page也能檢視到