Usando o SQL Server 2005.
Estou executando um enorme DELETE FROM sem cláusulas where. É basicamente equivalente a uma instrução TRUNCATE TABLE - exceto que eu não tenho permissão para usar TRUNCATE. O problema é que a tabela é enorme - 10 milhões de linhas e leva mais de uma hora para ser concluída. Existe alguma maneira de torná-lo mais rápido sem:
- Usando Truncar
- Desativando ou eliminando índices?
O log-t já está em um disco separado.
Todas as sugestões são bem-vindas!
sql-server
performance
delete
tuseau
fonte
fonte
Respostas:
O que você pode fazer é excluir em lotes assim:
Onde xxx é, digamos, 50000
Uma modificação disso, se você deseja remover uma porcentagem muito alta de linhas ...
fonte
Você pode usar a cláusula TOP para fazer isso facilmente:
fonte
Concordo com as sugestões de agrupar suas exclusões em partes gerenciáveis, se você não puder usar TRUNCATE, e eu gosto da sugestão de descartar / criar por sua originalidade, mas estou curioso sobre o seguinte comentário em sua pergunta:
Suponho que o motivo dessa restrição tenha a ver com a segurança que precisa ser concedida para truncar diretamente uma tabela e o fato de permitir truncar tabelas diferentes daquela com a qual você está preocupado.
Supondo que seja esse o caso, estou pensando se ter um procedimento armazenado criado que use TRUNCATE TABLE e use "EXECUTE AS" seria considerado uma alternativa viável para fornecer os direitos de segurança necessários para truncar a tabela diretamente.
Felizmente, isso lhe daria a velocidade necessária e, ao mesmo tempo, resolvesse as preocupações de segurança que sua empresa pode ter ao adicionar sua conta à função db_ddladmin.
Outra vantagem de usar um procedimento armazenado dessa maneira é que o próprio procedimento armazenado pode ser bloqueado para que somente contas específicas possam usá-lo.
Se, por algum motivo, essa não for uma solução aceitável e sua necessidade de remover os dados desta tabela for algo que precise ser feito uma vez por dia / hora / etc, solicitei que um trabalho do SQL Agent fosse criado para truncar a tabela em um horário programado todos os dias.
Espero que isto ajude!
fonte
Exceto truncar .. somente a exclusão em lotes pode ajudá-lo.
Você pode soltar a tabela e recriá-la, com todas as restrições e índices, fora do curso. No Management Studio, você tem a opção de criar um script para soltar e criar uma tabela, portanto deve ser uma opção trivial. Mas isso somente se você tiver permissão para executar ações DDL, o que vejo que não é realmente uma opção.
fonte
Como essa pergunta é uma referência tão importante, estou postando esse código que realmente me ajudou a entender a exclusão com loops e também as mensagens em um loop para acompanhar o progresso.
A consulta é modificada a partir desta pergunta duplicada. Crédito para @RLF pela base de consulta.
fonte