locked
Deleção em massa - SQL2000 RRS feed

  • Pergunta

  • Eu tenho um banco enorme no SQL2000. Ficou grande assim durante minhas férias. Foi de 6 para 60 Gbs em 20 dias.

    Descobri que poderia ser passado uma rotina para limpar algumas tabelas. Tem 2 tabelas com 80 milhões de registros cada uma.

    O aplicativo possui uma stored procedure que limpa esses registros.

    Executei a stored procedure, e ela está em execução desde as 9 horas da manhã. O banco está com Recovery model Simple. E o arquivo ldf que tinha 1024mb já está com 41 Gbs.

    Eu gostaria de saber se existe alguma forma de executar a stored procedure mais rapidamente, sem gerar ldf por exemplo. Existe alguma manha ?

    Eduardo

    terça-feira, 27 de julho de 2010 16:44

Respostas

  •  

    Efcampos, Infelizmente isso não é possível. Mesmo o log estando como simple o SQL ainda log algumas informações dessa execução até que a mesma termine. Ai sim o log é liberado devido ao modo Simple.


    Fabrício França Lima | MCP, MCTS, MCITP | Visite meu site: http://fabriciodba.spaces.live.com/ | Dicas de artigos SQL: Siga-me no twitter @fabriciodba.
    terça-feira, 27 de julho de 2010 20:59

Todas as Respostas

  • Eduardo,

    Também faço deleção em massa frequentemente de tabelas com histórico. No meu caso, eu uso a deleção com top 100.000 por exemplo, para deletar em bloco. Mas se voce realmente deseja limpar essas tabelas (todos registros), uma opcao interessante e rápida é o uso do TRUNCATE table. Mas é válido lembrar que esse comando limpa completamente uma tabela em questão de segundos. Nao te deixa nem opcao de rollback, porque os itens deletados nem passam  pelo ldf...

    att.
    Rafael

     

    terça-feira, 27 de julho de 2010 17:50
  • Eu acreditava que existisse alguma coisa que eu pudesse desligar no sistema sql antes de executar a stored procedure de deleção.

    Talvez algo que impedisse a geração de logs.

    Como eu não sou o dono do sistema, nem da stored procedure, fica difícil alterá-la.

    Ela deleta registros de diversas tabelas ao mesmo tempo, e existem foreign keys linkando as tabelas.

    Eduardo

    terça-feira, 27 de julho de 2010 20:12
  •  

    Efcampos, Infelizmente isso não é possível. Mesmo o log estando como simple o SQL ainda log algumas informações dessa execução até que a mesma termine. Ai sim o log é liberado devido ao modo Simple.


    Fabrício França Lima | MCP, MCTS, MCITP | Visite meu site: http://fabriciodba.spaces.live.com/ | Dicas de artigos SQL: Siga-me no twitter @fabriciodba.
    terça-feira, 27 de julho de 2010 20:59
  • Eduardo,

         Não há como impedir a geração de log, pq ele quer garantir que a transacao termine em um estado consistente, ou seja, caso ocorra um erro no meio do processo, ele executa um rollback.  Agora fica realmente complicado,  se vc nao pode alterar a maneira com ela faz a delecao...
    Olha eduardo, nem sei se é uma prática recomendada, mas eu fazia assim: ordenava as tabelas em ordem de dependencia  e executava um laço para proceder a execução de delecao com top, conforme disse acima. E a cada 100000 linhas excluidas, por exemplo, eu executava um shrink no arquivo de log dentro do proprio laco até nao existir mais registros para excluir. Assim eu evitava que meu disco de log enchesse...

     

    att.
    rafael

     

    terça-feira, 27 de julho de 2010 21:04
  • Abriram uma thread parecida. Da uma olhada nas respostas do Junior e Gustavo.

    http://social.msdn.microsoft.com/Forums/pt-BR/admingeralpt/thread/21f2a350-775e-4735-b891-3b9d21a6e184


    Fabrício França Lima | MCP, MCTS, MCITP | Visite meu site: http://fabriciodba.spaces.live.com/ | Dicas de artigos SQL: Siga-me no twitter @fabriciodba.
    terça-feira, 27 de julho de 2010 23:45