user database的initial size和dbcc shrinkfile

stswordman發表於2013-10-10

之前我們討論了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也能檢視到

 

 

相關文章