2009-10-26 63 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