Eu tenho uma mesa que ficou um pouco fora de controle. Eu não sou um DBA em si, mas pareço lembrar que a exclusão de um grande volume de linhas de uma só vez pode causar problemas no log de transações, prejudicar o desempenho geral do sistema durante a exclusão, etc ...
Existe uma maneira eficiente de criar um trabalho que exclua registros em pequenos lotes para dificultar outros acessos/desempenho e evitar problemas com o log de transações?
Esse processo pode ser bem lento é isso faz a diferença
Para contexto adicional, os critérios de exclusão serão baseados em algo como... where x like '%blah%'
. Além disso, há um índice clusterizado e 5 índices não clusterizados.
Você pode dividi-lo em pedaços - excluir em um loop; cada iteração de exclusão é sua própria transação e, em seguida, limpando o log no final de cada iteração de loop. Encontrar o tamanho ideal do bloco exigirá alguns testes.
Sugiro que você dê uma olhada neste artigo de Aaron Bertrand, onde ele explica os detalhes e executa testes para diferentes cenários, para mostrar o impacto (duração, log de transações): http://sqlperformance.com/2013/03/io- subsistema/exclusões de blocos
Quanto à
where x like '%blah%'
condição de exclusão - fará com que a consulta não seja sargável (não é possível aproveitar os índices para fazer uma busca de índice). Portanto, mesmo que você tenha um índice para dar suporte a columnx
, será uma varredura.Recursos para isso:
É bastante simples. Aqui está uma estrutura para permitir que você teste.
EDIT: É claro que a abertura de pesquisas curinga é notoriamente ruim para encontrar linhas, já que a coluna inteira precisa ser pesquisada. Além disso, como apontado no post de Aaron, você também precisa gerenciar os logs, seja no modo SIMPLE ou fazendo backups de log para evitar que os arquivos de log cresçam excessivamente.