sp_filestream_force_garbage_collection (Transact-SQL)

Aplica-se: SQL Server

Força o coletor de lixo (GC) FILESTREAM a ser executado, excluindo todos os arquivos FILESTREAM desnecessários.

Um contêiner FILESTREAM não pode ser removido até que todos os arquivos excluídos dentro dele sejam limpos pelo GC. O FILESTREAM GC é executado automaticamente. No entanto, se você precisar remover um contêiner antes que o GC seja executado, poderá usar sp_filestream_force_garbage_collection para executar o GC manualmente.

Convenções de sintaxe de Transact-SQL

Sintaxe

sp_filestream_force_garbage_collection
    [ @dbname = ] 'database_name'
    [ , [ @filename = ] 'logical_file_name' ]
[ ; ]

Argumentos

@dbname [ = ] 'database_name'

Significa o nome do banco de dados no qual o GC será executado.

@dbname é sysname. Se não for especificado, o banco de dados atual será assumido.

@filename [ = ] 'logical_file_name'

Especifica o nome lógico do contêiner FILESTREAM no qual o GC será executado. @filename é opcional. Se nenhum nome de arquivo lógico for especificado, o GC limpará todos os contêineres FILESTREAM no banco de dados especificado.

Valores do código de retorno

Valor Descrição
0 Êxito na operação
1 Falha na operação

Conjunto de resultados

Valor Descrição
file_name Indica o nome de contêiner FILESTREAM
num_collected_items Indica o número de itens FILESTREAM (arquivos ou diretórios) que foram coletados (excluídos) neste contêiner.
num_marked_for_collection_items Indica o número de itens FILESTREAM (arquivos ou diretórios) que foram marcados para GC neste contêiner. Esses itens ainda não foram excluídos, mas podem estar qualificados para exclusão após a fase de GC.
num_unprocessed_items Indica o número de itens FILESTREAM qualificados (arquivos ou diretórios) que não foram processados para GC neste contêiner FILESTREAM. Os itens podem não ser processados por vários motivos, incluindo:

- Arquivos que precisam ser fixados porque um backup de log ou ponto de verificação não foi feito.

- Arquivos no modelo de recuperação FULL ou BULK_LOGGED.

- Há uma transação ativa de longa duração.

- O trabalho do leitor de log de replicação não foi executado. Consulte o white paper Armazenamento FILESTREAM no SQL Server 2008 para obter mais informações.
last_collected_xact_seqno Retorna o número de sequência de log correspondente (LSN) até onde os arquivos do contêiner FILESTREAM especificado foram coletados pelo coletor de lixo.

Comentários

Executa explicitamente a tarefa de coleta de lixo FILESTREAM até a conclusão no banco de dados solicitado (e no contêiner FILESTREAM). O processo de GC remove arquivos que não são mais necessários. O tempo necessário para que essa operação seja concluída depende do tamanho dos dados FILESTREAM nesse banco de dados ou contêiner e da quantidade de atividade DML que ocorreu recentemente nos dados FILESTREAM. Embora essa operação possa ser executada com o banco de dados online, isso pode afetar o desempenho do banco de dados durante sua execução devido a várias atividades de E/S feitas pelo processo de GC.

Observação

Recomenda-se que essa operação seja executada somente quando necessário e fora do horário normal de operação.

É possível executar várias invocações desse procedimento armazenado simultaneamente em contêineres ou em bancos de dados separados.

Devido às operações de duas fases, o procedimento armazenado deve ser executado duas vezes para realmente excluir os arquivos FILESTREAM subjacentes.

A coleta de lixo depende do truncamento de log. Portanto, se os arquivos foram excluídos recentemente em um banco de dados usando o modelo de recuperação completa, eles serão coletados como lixo somente depois que um backup de log dessas partes do log de transações for feito e a parte do log for marcada como inativa. Em um banco de dados que usa o modelo de recuperação simples, um truncamento de log ocorre depois que a CHECKPOINT é emitido no banco de dados.

Permissões

Requer associação na função de banco de dados db_owner .

Exemplos

Os exemplos a seguir executam o GC para contêineres FILESTREAM no fsdb banco de dados.

R. Não especificar nenhum contêiner

USE fsdb;
GO
EXEC sp_filestream_force_garbage_collection @dbname = N'fsdb';

B. Especificar um contêiner

USE fsdb;
GO
EXEC sp_filestream_force_garbage_collection @dbname = N'fsdb',
    @filename = N'FSContainer';