2009-10-26 70 views
17

我已成功在我的SQL 2008服務器上設置了FILESTREAM;但是我注意到,即使當我刪除包含FILESTREAM數據的行時,物理數據文件似乎也不會被刪除。刪除行後留下FILESTREAM文件

通過物理文件,我指的是SQLServer的託管目錄中的文件,其中uniqueidentifer作爲文件名而不是添加到dbase的原始文件。

有誰知道SQLServer是否會最終刪除文件?如果從dbase中刪除了大量大文件,我希望能夠快速回收這些空間。

謝謝,

戴爾

回答

20

FILESTREAM數據是受事務控制,因此不會立即刪除。

取而代之的是,SQL Server運行一個垃圾收集器,它在確定它最終被刪除時清除舊數據。

documentation

FILESTREAM垃圾收集是由數據庫檢查點進程觸發的後臺任務。當生成足夠的事務日誌時,檢查點會自動運行。有關詳細信息,請參閱SQL Server 2008聯機叢書主題「CHECKPOINT和日誌的活動部分」(http://msdn.microsoft.com/en-us/library/ms189573.aspx)。考慮到FILESTREAM文件操作在數據庫的事務日誌中被最小化記錄,在生成的事務日誌記錄數量觸發檢查點進程併發生垃圾回收之前可能需要一段時間。如果這成爲問題,您可以使用CHECKPOINT語句強制垃圾回收。

2

DELETE FROM tbl_XXX DECLARE @test CHECKPOINT @test = 0

運行此在您的SQL Server 和您可以觀察到文件中獲取從文件系統也刪除..

您可以設置在執行刪除操作後等待垃圾收集器清理文件系統中的文件的分鐘數或秒數。

感謝

哈拉納

+0

簡單:DELETE FROM表CHECKPOINT – DanDan 2010-05-05 12:07:21

+1

@DanDan我知道這就像年前但我只是想警告其他用戶在刪除表CHECKPOINT命令時意外刪除表中的所有行的危險 用過的。我試過了,它刪除了我的表中的所有行。幸運的是,我的表格只包含示例數據。 – corix010 2014-12-08 17:03:29

13

使用

sp_filestream_force_garbage_collection 

不幸的是這僅適用> = SQL Server 2012的

+2

供參考 - 這僅適用於SQL 2012 – NotMe 2013-03-01 20:29:24

+0

是的謝謝。我也需要這個。升級到2012年的一個很好的理由! – LaBracca 2013-06-06 13:42:34

+0

我在本地的SQL Server 2012 Express上試過這個,它似乎沒有工作。 – corix010 2014-12-08 17:11:30