Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie lösche ich große Daten einer Tabelle in SQL ohne Protokoll?

  1. Wenn Sie alle Zeilen in dieser Tabelle löschen, ist die einfachste Option, die Tabelle abzuschneiden, so etwas wie

     TRUNCATE TABLE LargeTable
     GO
    

Truncate table leert einfach die Tabelle, Sie können die WHERE-Klausel nicht verwenden, um die zu löschenden Zeilen zu begrenzen, und es werden keine Trigger ausgelöst.

  1. Wenn Sie andererseits mehr als 80-90 Prozent der Daten löschen, sagen wir, wenn Sie insgesamt 11 Millionen Zeilen haben und 10 Millionen löschen möchten, wäre eine andere Möglichkeit, diese 1 Million Zeilen einzufügen (Datensätze, die Sie behalten möchten ) zu einer anderen Bereitstellungstabelle. Schneiden Sie diese große Tabelle ab und fügen Sie diese 1 Million Zeilen wieder ein.

  2. Oder wenn Berechtigungen/Ansichten oder andere Objekte, die diese große Tabelle als zugrunde liegende Tabelle haben, nicht durch das Löschen dieser Tabelle betroffen sind, können Sie diese relativ kleinen Mengen der Zeilen in eine andere Tabelle verschieben, diese Tabelle löschen und eine andere Tabelle mit derselben erstellen Schema, und importieren Sie diese Zeilen zurück in diese ex-Large-Tabelle.

  3. Eine letzte Möglichkeit, die mir einfällt, besteht darin, den Recovery Mode to SIMPLE zu ändern und löschen Sie dann Zeilen in kleineren Stapeln mit einer While-Schleife wie dieser:

     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
    

und vergessen Sie nicht, den Wiederherstellungsmodus wieder auf vollständig zu ändern, und ich denke, Sie müssen ein Backup erstellen, um ihn vollständig wirksam zu machen (die Änderungs- oder Wiederherstellungsmodi).