Configurações de limpeza do Ghost

10

Estou executando um banco de dados transacional alto (~ 175 mil transações / minuto em média, quase 9 milhões de registros por hora adicionados e removidos)

Até recentemente, isso não era um problema muito grande, pois estivemos com ~ 7,5 milhões de registros adicionados e removidos, mas com os mais recentes influxos de dados, a limpeza de fantasmas não parece ser capaz de acompanhar a limpeza do espaço não utilizado em tabelas / índices.

Alguns dias atrás, alcançamos 53 GB de 'Espaço Não Utilizado' em 16 tabelas (principalmente 2 delas); portanto, começamos a analisar o processo de limpeza de fantasmas para descobrir que ele é executado uma vez a cada 5 segundos e mais de 10 páginas.

Minha solução atual é que, de manhã cedo, estou executando três threads do seguinte comando:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

para acompanhar o atraso da noite anterior (quando a maioria de nossas exclusões ocorre)

Gostaria de saber se há alguma maneira de alterar as configurações padrão de 5 segundos e 10 páginas para dizer a cada segundo ou executar mais de 20 páginas, existe alguma maneira de fazer isso ou devo continuar girando vários processos de limpeza para limpar o dados ou se houver outras ações que possam ajudar com isso

A re-indexação é executada nos índices mais afetados pelo menos uma vez por semana (a maioria ocorre em dias alternados)

SQL Server 2012 Enterprise SP3_CU8 (atualizando para CU9 amanhã) no AlwaysOn High Availabilty Cluster também com replicação (distribuição em um servidor separado)

Ste Bov
fonte

Respostas:

4

Gostaria de saber se há alguma maneira de alterar as configurações padrão de 5 segundos e 10 páginas para dizer a cada segundo ou executar mais de 20 páginas

Não, não há. Pelo menos eu não sei a partir de agora :-)

se houver outras ações que possam ajudar com isso

No blog de Paul Randal - Um método que as pessoas às vezes consideram é forçar a limpeza de fantasmas para limpar tudo executando uma verificação de tabela ou índice (enfileirando todos os registros excluídos para a tarefa de limpeza de fantasmas).

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

Existe a possibilidade de você particionar a tabela e limpar a partição antiga em vez de excluir ? Para sua informação, o SQL Server 2016 e versões posteriores também permitem truncar partições individuais.

Além disso, você pode (TESTAR e implementar) - desativar a limpeza de fantasmas (sinalizador de rastreamento 661) e, em seguida, a rebuild index WITH ONLINE = ONopção, desde que você esteja usando a edição Enterprise.

Se você estiver usando o AlwaysON (com async) com replicação, ative o sinalizador de rastreamento 1448 - permite que o leitor de log de replicação avance, mesmo que as réplicas secundárias assíncronas não tenham reconhecido a recepção de uma alteração.

Certifique-se de ler Exclui as páginas divididas e os fantasmas encaminhados de Paul White para ver se suas tabelas possuem gatilhos ou colunas LOB que diminuiriam a velocidade.

Kin Shah
fonte