SQL Server 文件流-删除 "speed"

标签 sql sql-server 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

更新:

我尝试了较长时间的相同操作,插入/删除速度更接近我的需求,执行 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

最佳答案

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

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

感谢大家的投入。

关于SQL Server 文件流-删除 "speed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2158702/

相关文章:

SQL 使用 ROW_NUMBER() 更新记录

c# - 使用 sql server 在 wpf 中动态创建菜单

sql - 在 SQL Server 中使用已删除记录中的值

C++ 流对象线程安全吗?

c# - 在 FileStream 弹出响应后删除临时文件

sql - 用sql最快更新

sql - SQLite3-如何在SQL表中定位特定值?

sql - 合并两个 SQL 表

sql-server - SQL Server 行中可以存储的最大数据量是多少?

c++ - C++中流的优点是什么?