22

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

物理文件是指 SQLServer 托管目录中以唯一标识符作为文件名的文件,而不是添加到 dbase 的原始文件。

有谁知道 SQLServer 最终是否会删除该文件?如果从 dbase 中删除了很多大文件,我希望能够快速回收空间,仅此而已。

4

4 回答 4

25

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

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

文档中:

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

于 2009-10-26T14:13:41.827 回答
15

采用

sp_filestream_force_garbage_collection

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

于 2013-02-19T12:15:53.163 回答
4

首先,您必须为垃圾收集器工作创建一个检查点。删除行后,您可以运行此代码以消除所有不属于任何行的文件。

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
于 2018-11-16T00:58:55.687 回答
1

DELETE FROM tbl_XXX DECLARE @test CHECKPOINT @test = 0

在您的 sql server 中运行它,您还可以观察到文件也从文件系统中删除..

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

谢谢

哈拉纳特

于 2010-02-22T10:46:18.067 回答