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

Como excluir grandes dados da tabela no SQL sem log?


  1. Se você estiver excluindo todas as linhas dessa tabela, a opção mais simples é Truncar a tabela, algo como
     TRUNCATE TABLE LargeTable
     GO
    

Truncar a tabela simplesmente esvaziará a tabela, você não pode usar a cláusula WHERE para limitar as linhas que estão sendo excluídas e nenhum gatilho será acionado.

  1. Por outro lado, se você estiver excluindo mais de 80-90 por cento dos dados, digamos, se você tiver um total de 11 milhões de linhas e deseja excluir 10 milhões, outra maneira seria Inserir esses 1 milhão de linhas (registros que você deseja manter ) para outra tabela de preparo. Trunque esta tabela grande e insira novamente essas 1 milhão de linhas.

  2. Ou se permissões/exibições ou outros objetos que têm essa tabela grande como tabela subjacente não forem afetados pela eliminação desta tabela, você pode obter essas quantidades relativamente pequenas das linhas em outra tabela, soltar esta tabela e criar outra tabela com o mesmo esquema e importe essas linhas de volta para esta tabela ex-Large.

  3. Uma última opção que posso pensar é alterar o Recovery Mode to SIMPLE e, em seguida, exclua linhas em lotes menores usando um loop while algo assim:
     DECLARE @Deleted_Rows INT;
     SET @Deleted_Rows = 1;
    
    
     WHILE (@Deleted_Rows > 0)
       BEGIN
        -- Delete some small number of rows at a time
          DELETE TOP (10000)  LargeTable 
          WHERE readTime < dateadd(MONTH,-7,GETDATE())
    
       SET @Deleted_Rows = @@ROWCOUNT;
     END
    

e não se esqueça de alterar o modo de recuperação de volta para completo e acho que você precisa fazer um backup para torná-lo totalmente eficaz (os modos de alteração ou recuperação).