2009-10-26 4 views
17

Я успешно настроил FILESTREAM на моем сервере SQL 2008; однако я заметил, что даже когда я удалял строки, содержащие данные FILESTREAM, файл физических данных, похоже, не удаляется.Файлы FILESTREAM остаются после удаленной строки

Под физическим файлом я имею в виду файл в управляемом каталоге SQLServer с уникальным идентификатором в качестве имени файла, а не исходного файла, добавленного в базу данных.

Кто-нибудь знает, удастся ли SQLServer удалить файл? Если из dbase удалено большое количество больших файлов, я бы ожидал, что вы сможете быстро вернуть пространство, и это все.

Спасибо,

Dale

ответ

20

FILESTREAM данные подлежат контролю сделки и, следовательно, не удаляется мгновенно.

Вместо этого SQL Server запускает сборщик мусора, который очищает старые данные, когда он уверен, что он был в конечном счете удален.

От documentation:

FILESTREAM мусора является фоновой задачей, которая запускается в процессе контрольной точки базы данных. Контрольная точка автоматически запускается при создании журнала транзакций. Для получения дополнительной информации см. Электронная документация по SQL Server 2008 тема "CHECKPOINT и активная часть журнала" (http://msdn.microsoft.com/en-us/library/ms189573.aspx). Учитывая, что операции с файлами FILESTREAM минимально регистрируются в журнале транзакций базы данных, это может занять некоторое время до того, как количество созданных записей журнала транзакций инициирует процесс контрольной точки и сбор мусора. Если это становится проблемой, вы можете принудительно собрать сбор мусора с помощью инструкции CHECKPOINT.

2

УДАЛИТЬ ИЗ tbl_XXX DECLARE @test CHECKPOINT @test = 0

Выполнить это в SQL сервере и Вы можете наблюдать файл получать удален из файловой системы также ..

Вы можете установить количество минут или секунд, чтобы дождаться сборщика мусора для очистки файлов из файловой системы после выполнения операции удаления.

Благодаря

Харанат

+0

проще: удалить из таблицы CHECKPOINT – DanDan

+1

@DanDan Я знаю, что это, как лет назад но я просто хочу предупредить других пользователей об опасности случайного удаления всех строк в вашей таблице, когда команда 'DELETE FROM table CHECKPOINT' используемый. Я попробовал, и он удалил все строки в моей таблице. К счастью, моя таблица содержит только пример данных. – corix010

13

использование

sp_filestream_force_garbage_collection 

, к сожалению, это только работает> = SQL Server 2012

+2

FYI - Это только для SQL 2012 – NotMe

+0

Да спасибо. Мне это тоже нужно. Одна из веских причин для обновления до 2012 года! – LaBracca

+0

Я пробовал это на своем локальном SQL Server 2012 Express и, похоже, не работает. – corix010