Таблица файлов SQL Server: удалить файл

Я использую filetable. Когда я удаляю файлы из FileTable SQL Server, я хочу, чтобы файлы удалялись из папки, а когда я удаляю файл из папки, он должен быть удален из filetable.

И у меня есть второй вопрос: является ли filetable более быстрым способом сохранить файл на сервере и прочитать его (файлы размером более 1 МБ)?


person user2541236    schedule 26.11.2016    source источник


Ответы (3)


Для первого вопроса файлы должны быть удалены, как только вы удалите относительную строку (DELETE FROM ...) и зафиксируете. То же самое должно применяться и в обратном порядке (если вы удалите файл, соответствующая строка должна исчезнуть).

Это верно для файла, доступного через сетевую папку, физический файл будет удален позже, в зависимости от модели восстановления и процесса сборки мусора файлового потока (см. sp_filestream_force_garbage_collection хранимая процедура).

Что касается второго вопроса, доступ всегда будет медленнее, чем доступ к чистой файловой системе, из-за накладных расходов SQL Server (однако время поиска будет на несколько порядков быстрее).

Однако по сравнению с доступом к T-SQL все зависит от размера сохраняемого большого двоичного объекта. Короче говоря, если ваши большие двоичные объекты меньше 1 МБ, использование T-SQL должно быть быстрее. См. здесь: рекомендации по Реализации FILESTREAM для более подробных рисунков.

person Francesco Cogno    schedule 26.11.2016
comment
Есть ли у вас официальная ссылка на следующее утверждение: То же самое должно применяться в обратном порядке (если вы удаляете файл, соответствующая строка должна исчезнуть). . Я читаю здесь: Единственный способ чтобы удалить строку и, следовательно, файл, нужно использовать инструкцию Transact-SQL DELETE.. - person TT.; 26.11.2016
comment
Привет, ТТ, ссылка, которую вы разместили, посвящена FileStream. Вопрос был о FileTable. Хотя один использует другой (FileTable использует FileStream), это разные технологии. Хотя для удаления строки файлового потока вам действительно нужно использовать T-SQL, вы можете удалить файл, поддерживаемый таблицей файлов, с помощью обычной команды Win32. Это означает, что в FileTable драйвер фильтра автоматически выдает оператор удаления (см. ">https://www.microsoftpressstore.com/articles/article.aspx?p=2225060&seqNum=2). Извините за путаницу :). - person Francesco Cogno; 26.11.2016
comment
Нет проблем, приятель, я действительно запутался, не по твоей вине. Спасибо за отзыв! - person TT.; 26.11.2016
comment
Как я могу сократить время, затрачиваемое на удаление физического файла? - person user2541236; 28.11.2016

DROP TABLE [ IF EXISTS ] [ database_name . [ schema_name ] . | schema_name . ]  
table_name [ ,...n ]  
[ ; ]  

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

person Eben Varghese Paul    schedule 26.11.2016
comment
мой вопрос не в том, что нужно для удаления строки из таблицы файлов. Мой вопрос в том, как я могу удалить строку и физический файл из указанной папки одновременно - person user2541236; 26.11.2016

первое, что вы должны помнить, таблица файлов в SQL Server - это лучший способ ее использования, потому что это механизм менеджера, помогающий разработчику иметь шаблон для управления файлами. этот менеджер использует физическое место для сохранения файлов и создает таблицу для хранения основной информации о данных файла. Когда вы удаляете файл, диспетчер таблицы файлов выполняет задание, которое выполняется несколько раз, и это удаляет физический файл.

если вы хотите удалить физический файл немедленно, вы можете использовать это предложение:

 checkpoint;
 EXEC sp_filestream_force_garbage_collection @dbname = N'[DB Name]';    

вы должны помнить об использовании этого предложения после удаления строки из таблицы файлов с задержкой или использовать его в триггере SQL (после удаления):

Create TRIGGER [Schema].[TriggerName]
   ON  [Schema].[TableName]
   after  DELETE

AS 

  declare @T  table ([file_name]  varchar(50),num_col int, num_marked int , num_unproce int ,last_col bigint)
BEGIN

  checkpoint;
insert into @T EXEC sp_filestream_force_garbage_collection @dbname = N'[DB Name]'; 

END
person sorosh saloty    schedule 31.12.2018