Compartilhar via


Guia do processo de limpeza de fantasmas

O processo de limpeza fantasma é um processo de plano de fundo monotarefa que remove registros de páginas marcadas para exclusão. O artigo a seguir fornece uma visão geral desse processo.

Registros fantasmas

Os registros excluídos de um nível de folha de uma página de índice não são removidos fisicamente da página – em vez disso, o registro é marcado como "a ser excluído" ou fantasma. Isso significa que a fila permanece na página, mas uma pequena modificação é feita no cabeçalho da fila para indicar que se trata realmente de uma fila fantasma. Isso é para otimizar o desempenho durante uma operação de exclusão. Fantasmas são necessários para bloqueio em nível de linha, mas também são necessários para isolamento de instantâneo em que precisamos manter as versões mais antigas das linhas.

Tarefa de limpeza de registro fantasma

Os registros marcados para exclusão ou ghosted são removidos pelo processo de limpeza fantasma em segundo plano. Esse processo em segundo plano é executado em algum momento após a confirmação da transação de exclusão e remove fisicamente os registros fantasmas das páginas. O processo de limpeza fantasma é executado automaticamente em um intervalo (a cada 5 segundos para o SQL Server 2012+, a cada 10 segundos para o SQL Server 2008/2008R2) e verifica se alguma página foi marcada com registros fantasmas. Se encontrar algum, ele irá e excluirá os registros marcados para exclusão ou fantasmados, afetando no máximo 10 páginas com cada execução.

Quando um registro está marcado como fantasma, o banco de dados é assinalado como tendo entradas fantasmas, e o processo de limpeza de fantasmas varrerá apenas esses bancos de dados. O processo de limpeza fantasma também marcará o banco de dados como "sem registros fantasmas" depois que todos os registros fantasmas forem excluídos e ele ignorará esse banco de dados na próxima vez que ele for executado. O processo também ignorará todos os bancos de dados em que não for possível usar um bloqueio compartilhado e tentará novamente na próxima vez que for executado.

A consulta abaixo pode identificar quantos registros fantasmas existem em um único banco de dados.

SELECT sum(ghost_record_count) total_ghost_records, db_name(database_id) 
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'SAMPLED')
group by database_id
order by total_ghost_records desc

Desabilitar a limpeza fantasma

Em sistemas de alta carga com muitas exclusões, o processo de limpeza de registros residuais pode causar um problema de desempenho ao manter as páginas no pool de buffers e gerar E/S. Dessa forma, é possível desabilitar esse processo com o uso do sinalizador de rastreamento 661. No entanto, há implicações de desempenho ao desabilitar o processo.

Desabilitar o processo de limpeza fantasma pode fazer com que seu banco de dados fique desnecessariamente grande e possa levar a problemas de desempenho. Como o processo de limpeza fantasma remove registros marcados como fantasmas, desabilitar o processo deixará esses registros na página, impedindo que o SQL Server reutilize esse espaço. Isso força o SQL Server a adicionar dados a novas páginas, resultando em arquivos de banco de dados inchados e também podendo causar divisões de página. As divisões de página levam a problemas de desempenho ao criar planos de execução e ao fazer operações de verificação.

Depois que o processo de limpeza de fantasmas for desabilitado, será necessário tomar alguma ação para remover os registros fantasmas. Uma opção é executar uma reconstrução de índice, que redistribuirá os dados nas páginas. Outra opção é executar manualmente sp_clean_db_free_space (para limpar todos os arquivos de dados do banco de dados) ou sp_clean_db_file_free_space (para limpar um único arquivo de dados de banco de dados), que excluirá registros fantasmas.

Aviso

A desabilitação do processo de limpeza fantasma geralmente não é recomendada. Isso deve ser testado minuciosamente em um ambiente controlado antes de ser implementado permanentemente em um ambiente de produção.