Como faço para acelerar exclusões de uma grande tabela de banco de dados?

Aqui está o problema que estou tentando resolver: Eu terminei recentemente um re-design da camada de dados que me permite balancear a carga do meu banco de dados em múltiplos shards. Para manter os shards balanceados, preciso migrar dados de um shard para outro, o que envolve a cópia do shard A para o shard B e a exclusão dos registros do shard A. Mas tenho várias tabelas que são muito grandes, e ter muitas chaves estrangeiras apontadas para elas, portanto, excluir um único registro da tabela pode levar mais de um segundo.

Em alguns casos, preciso excluir milhões de registros das tabelas, e isso leva muito tempo para ser prático.

Desativar chaves estrangeiras não é uma opção. A exclusão de grandes lotes de linhas também não é uma opção porque esse é um aplicativo de produção e as exclusões grandes bloqueiam muitos recursos, causando falhas. Estou usando o Sql Server e sei sobre tabelas particionadas, mas as restrições de particionamento (e as taxas de licença para a edição corporativa) são tão irreais que não são possíveis.

Quando comecei a trabalhar nesse problema, achei que a parte difícil seria escrever o algoritmo que descobre como excluir linhas do nível de folha até o topo do modelo de dados, de modo que nenhuma restrição de chave estrangeira seja violada ao longo do caminho. Mas resolver esse problema não me ajudou, já que leva semanas para excluir os registros que precisam desaparecer durante a noite.

Eu já construí de maneira a marcar os dados como virtualmente excluídos, de modo que, no que diz respeito ao aplicativo, os dados se foram, mas ainda estou lidando com arquivos de dados grandes, backups grandes e consultas mais lentas devido ao tamanho as mesas.

Alguma ideia? Eu já li posts relacionados antigos aqui e não encontrei nada que pudesse ajudar.

questionAnswers(7)

yourAnswerToTheQuestion