Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A limpeza de fantasmas é um processo em segundo plano que remove fisicamente as linhas que foram marcadas para eliminação por instruções DML. O artigo seguinte apresenta uma visão geral deste processo.
Linhas fantasmas
As linhas que são eliminadas das páginas ao nível das folhas de um índice não são fisicamente removidas da página. Em vez disso, a linha é marcada para remoção futura ou ocultada. Isto significa que a linha permanece na página, mas uma mudança é feita no cabeçalho da linha para indicar que a linha é um fantasma. O objetivo é otimizar o desempenho durante uma operação de eliminação. Os fantasmas são necessários para bloqueio ao nível da linha e para transações de isolamento de instantâneos, onde o motor da base de dados tem de manter versões mais antigas das linhas.
Tarefa de limpeza de fantasmas
As linhas marcadas para eliminação, ou que são ignoradas, são limpas pelo processo de limpeza de fantasmas em segundo plano quando já não são necessárias. A limpeza de fantasmas é executada periodicamente e verifica se alguma página tem linhas fantasmas. Se encontrar algum deles, remove fisicamente essas linhas. Existe um único tópico de limpeza de fantasmas para todas as bases de dados numa instância do Database Engine.
Quando uma linha é ignorada, a base de dados é marcada como tendo entradas ignoradas. O processo de limpeza de fantasmas apenas digitaliza essas bases de dados. O processo de limpeza de fantasmas também marca a base de dados como não tendo linhas fantasmas assim que todas as linhas fantasmas são removidas, e ignora esta base de dados na próxima execução. O processo também ignora qualquer base de dados se não conseguir obter um bloqueio partilhado na base de dados. Tenta novamente a aquisição de bloqueio na base de dados na próxima execução.
A consulta seguinte devolve um número aproximado de linhas fantasmas numa base 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;
Desativar a limpeza de fantasmas
Em sistemas de alta carga com muitas eliminações, o processo de limpeza de fantasmas pode reduzir o desempenho se substituir muitas das páginas frequentemente acedidas no pool de buffer por outras páginas que tenham linhas fantasmas. Como resultado, as páginas frequentemente acedidas têm de ser relidas a partir do disco, gerando E/S extra do disco e aumentando a latência de consulta. Se isto acontecer, pode desativar a limpeza de fantasmas usando a flag de rastreio 661.
Sem a limpeza de fantasmas, a tua base de dados pode crescer desnecessariamente, o que também pode reduzir o desempenho devido ao consumo extra de I/O e memória. Como o processo de limpeza de fantasmas remove linhas marcadas como fantasmas, desativar o processo mantém essas linhas na página, impedindo que o motor da base de dados reutilize esse espaço. Isto obriga o motor de base de dados a adicionar dados a novas páginas, levando a ficheiros de base de dados inchados e também pode causar divisões de página. As divisões de página aumentam a I/O do disco, o que pode reduzir o desempenho das consultas. Se a limpeza de fantasmas estiver desativada, a base de dados pode ficar sem espaço.
Advertência
Desativar permanentemente o processo de limpeza de fantasmas não é recomendado.
Para remover linhas fantasmas quando a limpeza de fantasmas está desativada, reconstrua os índices das tabelas onde as linhas foram apagadas. Reconstruir um índice cria novas páginas a partir de dados existentes, omitindo linhas fantasmas no processo.