SQL Server文件流 - 删除"速度"

Ben*_*ttr 8 sql sql-server filestream

我第一次使用filestream数据类型(SQL Server 2008),当我进行一些快速插入/删除时,我遇到了问题.基本上,文件实际从文件系统中删除的速度比插入/删除速度慢,即使我手动调用垃圾收集器(据我所知,CHECKPOINT应该调用垃圾收集器).

下面的代码说明了问题 - 执行大约需要30秒,但是你需要等待几分钟才能从文件系统中删除最后一个文件(当我查找C:\ FSTest\Files文件夹时)

有没有办法加快垃圾收集器?(它似乎每10秒大致删除20个文件 - 这让我相信,如果我每秒存储/删除超过2条记录,我最终会最终填满硬盘)

谢谢

CREATE DATABASE FSTest ON PRIMARY
    (NAME = FSTest_data, FILENAME = N'C:\FSTest\FSTest_data.mdf'),
FILEGROUP FSTestFileGroup CONTAINS FILESTREAM
    (NAME = FSTestFiles,FILENAME = N'C:\FSTest\Files')
LOG ON 
    (NAME = 'FSTest_log', FILENAME = N'C:\FSTest\FSTest_log.ldf');
GO

USE FSTest;
GO

CREATE TABLE FSTest (
    Guid UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWSEQUENTIALID(),
    Name VARCHAR (25),
    Data VARBINARY(MAX) FILESTREAM);
GO

ALTER DATABASE FSTest SET RECOVERY SIMPLE;
GO

SET NOCOUNT ON
DECLARE @test int
SET @test=0
WHILE @test<1000 BEGIN
    INSERT INTO FSTest(Name,Data) VALUES('test',CAST('abc' AS VARBINARY(MAX)))
    DELETE FROM FSTest WHERE Name='test'
    CHECKPOINT
    SET @test = @test+1
END
Run Code Online (Sandbox Code Playgroud)

更新:

我尝试了相同的更长时间,插入/删除速度更接近我的需要,并且在执行30分钟后,可以观察到相同的情况:文件创建速度快,然后被删除.

SET NOCOUNT ON
DECLARE @test int
SET @test=0
WHILE @test<100000 BEGIN
    INSERT INTO FSTest(Name,Data) VALUES('test',CAST('abc' AS VARBINARY(MAX)))
    DELETE FROM FSTest WHERE Name='test'
    WAITFOR DELAY '00:00:00:200'
    CHECKPOINT
    SET @test = @test+1
END
Run Code Online (Sandbox Code Playgroud)

Ben*_*ttr 5

经过一些更多的研究(感谢Paul Randal的博客 - 关于文件流和垃圾收集的大量非常详细的信息),一旦删除行并执行检查点,文件就会被放入系统表(Tombstone表)中,然后每个10秒进程(Ghost清理)运行并从该表中删除一些项目(确切地说是20).所以基本上我们只限于2次删除/秒,似乎还没有办法改变这种行为.

由于我每秒持续4次删除,我需要找到文件流的替代方法.

感谢大家的投入.