Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A limpeza de fantasmas é um processo em segundo plano que elimina fisicamente as linhas que foram marcadas para exclusão por instruções DML. O artigo a seguir fornece uma visão geral desse processo.
Linhas fantasmas
As linhas excluídas das páginas de nível folha de um índice não são removidas fisicamente da página. Em vez disso, a linha é marcada para remoção futura ou oculta. Isso significa que a linha permanece na página, mas um indicador é alterado no cabeçalho da linha para indicar que a linha é um 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 e para transações de isolamento de instantâneo em que o mecanismo de banco de dados deve manter versões de linha mais antigas.
Tarefa de limpeza de fantasmas
As linhas marcadas para exclusão ou fantasmas são limpas pelo processo de limpeza fantasma em segundo plano quando não são mais necessárias. A limpeza fantasma é executada periodicamente e verifica se alguma página tem linhas fantasmas. Se encontrar algum, removerá fisicamente essas linhas. Há um único thread de limpeza fantasma para todos os bancos de dados em uma instância do Mecanismo de Banco de Dados.
Quando uma linha é marcada como fantasma, o banco de dados é identificado por ter entradas fantasmas. O processo de limpeza fantasma apenas verifica esses bancos de dados. O processo de limpeza fantasma também marca o banco de dados como sem linhas fantasmas depois que todas as linhas fantasmas são removidas e ignora esse banco de dados na próxima vez que ele é executado. O processo também ignorará qualquer banco de dados se ele não conseguir adquirir um bloqueio compartilhado no banco de dados. Ele tenta bloquear novamente a aquisição no banco de dados na próxima vez que for executado.
A consulta a seguir retorna um número aproximado de linhas fantasmas em um banco de dados.
SELECT SUM(ghost_record_count) AS total_ghost_records,
DB_NAME(database_id) AS database_name
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 de fantasmas
Em sistemas de alta carga com muitas exclusões, o processo de limpeza fantasma poderá reduzir o desempenho se substituir muitas das páginas acessadas com frequência no pool de buffers por outras páginas que têm linhas fantasmas. Como resultado, as páginas acessadas com frequência devem ser relançadas do disco, gerando E/S de disco extra e aumentando a latência da consulta. Se isso ocorrer, você poderá desabilitar a limpeza fantasma usando o sinalizador de rastreamento 661.
Sem a limpeza de fantasmas, seu banco de dados pode crescer desnecessariamente grande, o que também pode reduzir o desempenho devido ao consumo extra de E/S e memória. Como o processo de limpeza fantasma remove linhas marcadas como fantasmas, desabilitar o processo deixa essas linhas na página, impedindo que o mecanismo de banco de dados reutilize esse espaço. Isso força o mecanismo de banco de dados a adicionar dados a novas páginas, levando a arquivos de banco de dados inchados, o que também pode causar divisões de páginas. As divisões de página aumentam a E/S do disco, o que pode reduzir o desempenho da consulta. Se a limpeza de fantasmas estiver desabilitada, o banco de dados poderá ficar sem espaço.
Aviso
Não é recomendável desabilitar permanentemente o processo de limpeza fantasma.
Para remover linhas fantasmas quando a limpeza fantasma estiver desabilitada, recompile índices em tabelas em que as linhas foram excluídas. A recriação de um índice cria novas páginas com base em dados existentes, omitindo linhas fantasmas no processo.