gpt4 book ai didi

SQL Server 文件流-删除 "speed"

转载 作者:行者123 更新时间:2023-12-02 13:03:23 24 4
gpt4 key购买 nike

我是第一次使用文件流数据类型(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com