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