Pergunta

I configurou com êxito FILESTREAM no meu SQL Server 2008; no entanto tenho notado que mesmo quando eu tiver excluído linhas contendo dados FILESTREAM, o arquivo de dados física parece não ficar excluído.

No arquivo físico, quero dizer o arquivo no diretório gerenciado do SQLServer com uma uniqueidentifer como o nome do arquivo não o arquivo original adicionado à dbase.

Alguém sabe se SQLServer irá apagar o arquivo, eventualmente? Se há um monte de grandes arquivos removidos do dbase eu esperaria para ser capaz de recuperar o espaço rapidamente isso é tudo.

Foi útil?

Solução

dados FILESTREAM está sujeito a controle de transação e, portanto, não é excluída imediatamente.

Em vez disso, SQL Server funciona um coletor de lixo que limpa os dados de idade, quando é certo que tinha sido, em última instância excluída.

A partir da documentação :

coleção FILESTREAM lixo é uma tarefa de fundo que é acionado pelo processo de verificação de banco de dados. Um ponto de verificação é executado automaticamente quando o log de transações suficiente foi gerado. Para mais informações, consulte o SQL Server 2008 Books Online tópico “CHECKPOINT ea parte ativa do Log” ( http://msdn.microsoft.com/en-us/library/ms189573.aspx ). Dado que as operações de arquivo FILESTREAM são minimamente registradas no log de transações do banco de dados, pode demorar algum tempo antes que o número de registros de log de transações gatilhos gerou um processo de verificação e coleta de lixo ocorre. Se isso se torna um problema, você pode forçar a coleta de lixo usando a CHECKPOINTstatement.

Outras dicas

uso

sp_filestream_force_garbage_collection

Infelizmente isso só funciona> = SQL Server 2012

DELETE FROM tbl_XXX DECLARE @Test CHECKPOINT @Test = 0

Executar isso em seu servidor sql E você pode observar o arquivo ficar excluído do sistema de arquivos também ..

Você pode definir o número de minutos ou segundos para aguardar o coletor de lixo para limpar os arquivos de sistema de arquivos após a realização da operação de exclusão.

Graças

Haranath

Primeiro você tem que criar um Checkpoint para o trabalho Garbage Collector . Depois de excluídos linhas que você pode executar este código para eliminar todos os arquivos que não pertencem a qualquer linha.

USE [DataBaseName]
GO

-- Create a checkpoint on current database
CHECKPOINT
GO 

-- Execute Garbage Collector after a checkpoint created
EXEC sp_filestream_force_garbage_collection  'DataBaseName'
GO
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top