Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso excluir dados expirados de uma tabela enorme sem que o arquivo de log fique fora de controle?


Achei útil ao fazer exclusões da tabela com um grande número de linhas para excluir linhas em lotes de, digamos, 5.000 ou mais (eu costumo testar para ver qual valor funciona mais rápido, às vezes são 5.000 linhas, às vezes 10.000 etc.) . Isso permite que cada operação de exclusão seja concluída rapidamente, em vez de esperar muito tempo para que uma instrução elimine 400 milhões de registros.

No SQL Server 2005, algo assim deve funcionar (por favor, teste primeiro, é claro):
WHILE EXISTS ( SELECT * FROM giganticTable WHERE exp_date < getDate())
BEGIN
  DELETE TOP(5000) FROM giganticTable WHERE exp_date < getDate()
END

Eu veria o que a exclusão em lotes faz com o tamanho do arquivo de log. Se ainda estiver explodindo os logs, tente alterar o modelo de recuperação para Simples , excluindo os registros e, em seguida, voltando para Bulk Logged, mas somente se o sistema puder tolerar a perda de alguns dados recentes. Eu definitivamente faria um backup completo antes de tentar esse procedimento. Este tópico também sugere que você possa configurar um trabalho para fazer backup dos logs com apenas truncar especificado, para que possa ser outra opção. Espero que você tenha uma instância com a qual possa testar, mas eu começaria com as exclusões em lote para ver como isso afeta o desempenho e o tamanho do arquivo de log.