我已经在我的 SQL 2008 服务器上成功设置了 FILESTREAM;但是我注意到,即使我删除了包含 FILESTREAM 数据的行,物理数据文件似乎也没有被删除。
我所说的物理文件是指 SQLServer 托管目录中以唯一标识符作为文件名的文件,而不是添加到数据库中的原始文件。
有谁知道SQLServer最终是否会删除该文件?如果从数据库中删除了很多大文件,我希望能够快速回收空间,仅此而已。
FILESTREAM
数据受事务控制,因此不会立即删除。
相反,
SQL Server
运行垃圾收集器,当确定旧数据最终被删除时,它会清除旧数据。
来自文档:
垃圾收集是由数据库检查点进程触发的后台任务。当生成足够的事务日志时,会自动运行检查点。有关详细信息,请参阅SQL Server 2008 联机丛书主题“FILESTREAM
和日志的活动部分”(http://msdn.microsoft.com/en-us/library/ms189573.aspx)。鉴于CHECKPOINT
文件操作最少记录在数据库的事务日志中,因此生成的事务日志记录的数量可能需要一段时间才能触发检查点进程并发生垃圾收集。如果这成为问题,您可以使用FILESTREAM
语句强制进行垃圾回收。CHECKPOINT
使用
sp_filestream_force_garbage_collection
不幸的是,这仅适用于 >= SQL Server 2012
DELETE FROM tbl_XXX DECLARE @test CHECKPOINT @test = 0
在 SQL Server 中运行它 您还可以观察到文件从文件系统中删除。
您可以设置执行删除操作后等待垃圾收集器从文件系统中清理文件的分钟或秒数。