SQL Server Filestream - удаляет “скорость”

Я работаю с filestream типом данных впервые (SQL Server 2008), и я сталкиваюсь с проблемами, когда я делаю, некоторые быстро вставляют/удаляют. В основном скорость, на которой файлы на самом деле удалены из FileSystem, является путем медленнее затем вставить/удалить скорость, даже если я вызываю сборщик "мусора" вручную (Насколько я знаю, что КОНТРОЛЬНАЯ ТОЧКА, как предполагается, вызывает сборщик "мусора").

Код ниже иллюстрирует проблему - требуется примерно 30 секунд к, выполняется, но необходимо ожидать довольно много минут последнего файла, который будет удален из файловой системы (Когда я ищу папку C:\FSTest\Files),

Там какой-либо путь состоит в том, чтобы ускорить сборщик "мусора"? (Это кажется, примерно удаляет 20 файлов каждые 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
8
задан Benoittr 9 February 2010 в 15:43
поделиться

3 ответа

После дополнительных исследований (и благодаря блогу Пола Рэндала - много очень подробной информации о файловом потоке и сборке мусора), после удаления строк и выполнения контрольной точки файлы помещаются в системную таблицу (таблица Tombstone). , затем каждые 10 секунд запускается процесс (Ghost Cleanup), который удаляет некоторые элементы из этой таблицы (точнее, 20). Таким образом, в основном мы ограничены 2 удалениями в секунду, и, похоже, (пока) нет способа изменить это поведение.

Поскольку у меня постоянно выполняется 4 удаления в секунду, мне нужно будет найти альтернативу файловому потоку.

Спасибо всем за ваш вклад.

5
ответ дан 5 December 2019 в 20:16
поделиться

Как сказал Ремус, если вы используете полную модель восстановления, то все сложно. Но даже под простой моделью восстановления необходимо иметь в виду, что контрольно-пропускной пункт вызывает сборщик мусора (GC), но он не гарантирует, что GC будет удалять все файлы в одном проходе. В настоящее время GC имеет ограничение на количество операций, которые он может продолжать в одном вызове. Кроме того, файлы удаляются с опцией file_delete_on_close, поэтому до тех пор, пока есть открытые ручки в файл, вы все равно будете видеть его, хотя GC, возможно, уже удалил его. Такие открытые ручки могут удерживать антивирусными программами или другими драйверами фильтра файловой системы.

Наконец, если вы не уходите на самом деле не заканчиваете дисковое пространство, я бы не беспокоился о нежилых файлах - они в конечном итоге будут удаляться в рамках автоматической контрольной точки базы данных. Я полагаю (хотя считаю, что - это ключевое слово здесь), что, хотя даже оно может иметь медленное «время запуска», GC будет идти в ногу с физическими удалениями файлов, если вы постоянно проводитесь в течение более длительного периода времени (минуты ?).

Если вы заботитесь о производительности, сохраняя филеитвесовые контейнеры на системном диске, могут не быть такой хорошей идеей. См. здесь для подсказки производительности FileStream.

2
ответ дан 5 December 2019 в 20:16
поделиться

Все немного сложнее, чем простая контрольная точка. Файл можно удалить, когда последний VLF, содержащий записи журнала о создании файла, неактивен. См. Сборка мусора FILESTREAM .

1
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: