Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment supprimer de grandes données de table en SQL sans journal?

  1. Si vous supprimez toutes les lignes de ce tableau, l'option la plus simple consiste à tronquer le tableau, quelque chose comme

     TRUNCATE TABLE LargeTable
     GO
    

Tronquer la table videra simplement la table, vous ne pouvez pas utiliser la clause WHERE pour limiter les lignes supprimées et aucun déclencheur ne sera déclenché.

  1. D'autre part, si vous supprimez plus de 80 à 90% des données, disons que vous avez un total de 11 millions de lignes et que vous souhaitez supprimer 10 millions, une autre méthode serait d'insérer ces 1 million de lignes (enregistrements que vous souhaitez conserver ) vers une autre table intermédiaire. Tronquez ce grand tableau et réinsérez ces 1 millions de lignes.

  2. Ou si les autorisations/vues ou d'autres objets qui ont cette grande table comme table sous-jacente ne sont pas affectés par la suppression de cette table, vous pouvez obtenir ces quantités relativement petites de lignes dans une autre table, supprimer cette table et créer une autre table avec le même schéma, et réimportez ces lignes dans cette table ex-Large.

  3. Une dernière option à laquelle je peux penser est de changer le Recovery Mode to SIMPLE puis supprimez les lignes par lots plus petits à l'aide d'une boucle while, par exemple :

     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
    

et n'oubliez pas de remettre le mode de récupération en mode complet et je pense que vous devez effectuer une sauvegarde pour le rendre pleinement efficace (les modes de changement ou de récupération).