Я впервые работаю с типом данных файлового потока (SQL Server 2008), и у меня возникают проблемы, когда я выполняю быструю вставку / удаление. В основном, скорость, с которой файлы фактически удаляются из FileSystem, намного ниже, чем скорость вставки / удаления, даже если я вызываю сборщик мусора вручную (насколько я знаю, CHECKPOINT должен вызывать сборщик мусора).
Приведенный ниже код иллюстрирует проблему: выполнение занимает около 30 секунд, но вам нужно подождать несколько минут, чтобы последний файл был удален из файловой системы (когда я просматриваю папку C: \ FSTest \ Files )
Есть ли способ ускорить сборщик мусора? (Кажется, примерно 10 файлов удаляются каждые 10 секунд, и это заставляет меня поверить, что если я буду хранить / удалять более 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