删除行后删除FILESTREAM文件

时间:2009-10-26 14:06:25

标签: sql sql-server-2008 blob filestream

我已在SQL 2008服务器上成功设置了FILESTREAM;但是我注意到即使我删除了包含FILESTREAM数据的行,物理数据文件似乎也不会被删除。

通过物理文件,我指的是SQLServer托管目录中的文件,其唯一的文件名不是添加到dbase的原始文件。

有人知道SQLServer最终是否会删除该文件?如果从dbase中删除了大量大文件,我希望能够快速回收这些空间。

4 个答案:

答案 0 :(得分:24)

FILESTREAM数据受交易控制,因此不会立即删除。

相反,SQL Server运行一个垃圾收集器,当它确定最终被删除时,它会清除旧数据。

来自documentation

  

FILESTREAM垃圾收集是由数据库检查点进程触发的后台任务。生成足够的事务日志时,将自动运行检查点。有关详细信息,请参阅 SQL Server 2008联机丛书主题“CHECKPOINT和日志的活动部分”(http://msdn.microsoft.com/en-us/library/ms189573.aspx)。鉴于FILESTREAM文件操作在数据库的事务日志中记录最少,在生成的事务日志记录数量触发检查点进程并发生垃圾收集之前可能需要一段时间。如果这成为问题,您可以使用CHECKPOINT语句强制进行垃圾回收。

答案 1 :(得分:14)

使用

sp_filestream_force_garbage_collection

不幸的是,这仅适用于> = SQL Server 2012

答案 2 :(得分:1)

从tbl_XXX DECLARE删除@test CHECKPOINT @test = 0

在sql server中运行它 你可以观察文件从文件系统中删除..

您可以设置执行删除操作后等待垃圾收集器从文件系统中清除文件的分钟数或秒数。

由于

haranath

答案 3 :(得分:1)

首先,您必须为Checkpoint工作创建一个Garbage Collector。删除行后,您可以运行此代码以消除不属于任何行的所有文件。

USE [DataBaseName]
GO

-- Create a checkpoint on current database
CHECKPOINT
GO 

-- Execute Garbage Collector after a checkpoint created
EXEC sp_filestream_force_garbage_collection  'DataBaseName'
GO