当前位置: 首页 > 面试题库 >

SQL Server文件流-删除“已填充”。

甄霖
2023-03-14
问题内容

我第一次使用文件流数据类型(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的博客-
有关文件流和垃圾收集的大量非常详细的信息),一旦删除了行并执行了检查点,则将文件放入系统表(Tombstone表)中,然后将每个运行一个进程(“
Ghost清理”)10秒钟,并从该表中删除一些项(准确地说是20项)。因此,基本上,我们仅限于2次删除/秒,而且似乎(目前)还没有办法更改此行为。

由于我每秒要进行4次删除,因此我需要找到filestream的替代方法。

感谢大家的投入。



 类似资料:
  • 问题内容: 我正在使用FileWriter写入文件,并注意到即使删除了文件(进程外),FileWriter也不会引发任何异常。 这正常吗? 问题答案: 这取决于您的操作系统: 在Windows上,通常无法删除打开的文件。 在Unix上,完全可以接受删除打开的文件并继续写入(或从中读取)文件。删除文件后,它将不再具有目录条目。但是,其内容将继续存在于磁盘上,直到关闭该文件。一旦所有引用该文件的打开句

  • 加载项目时出错 无法加载模块FirstWebApp 当我查看详细信息时,它说它找不到我的第一个webapp.iml文件,因此无法加载我的项目。

  • 我有如下所示的大型数据矩阵: 前两列是ID,总是整数,其余6列是每个ID的2对(X,Y,Z)坐标(浮点数)。 有人知道如何让fprintf在移除无关紧要的尾随零后只留一个空格吗?使用fprintf很好,因为我不需要任何循环,当你有几千个矩阵要写出来时,如果我必须在循环中做一些检查,我想这会很慢?

  • 在我用fabric集成将应用程序更改为firebase Crashlytics之后,应用程序开始在HMS设备上崩溃,并出现如下错误。我没有任何问题与谷歌播放设备。我更改了google-service.json,之后可以跟踪崩溃信息。

  • 问题内容: 如何使用node.js删除文件? http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback 我没有看到删除命令? 问题答案: 我想你要用。 有关更多信息,请参见此处。

  • 问题内容: 我正在使用Log4j作为我正在研究的项目中的日志记录框架。我有以下情况:Log4j配置为将日志写入日志文件。有时,此日志文件将复制到另一个目标并删除。日志记录框架可以正常工作,但是由于已删除日志,因此日志未写入日志文件。有什么方法可以告诉Log4j重新创建文件并继续将日志写入日志文件。 最好的问候,拉希德 问题答案: 我研究了log4j的来源,发现log4j无法创建新的日志文件,它只是