Verschieben Sie SQL Server-Daten in begrenzten (1000 Zeilen) Chunks

9

Ich schreibe einen Prozess, der Zeilen aus einer SQL Server-Tabelle basierend auf einer Datetime-Spalte archiviert. Ich möchte alle Zeilen mit einem Datum vor X verschieben, aber das Problem ist, dass es für jedes Datum Millionen von Zeilen gibt, also macht ein BEGIN TRANSACTION ... INSERT ... DELETE ... COMMIT für jedes Datum zu lange und sperrt die Datenbank für andere Benutzer.

Gibt es eine Möglichkeit, dass ich es in kleineren Brocken machen kann? Vielleicht mit ROWCOUNT oder so?

Ich hatte ursprünglich Folgendes in Erwägung gezogen:

%Vor%

Aber dann wurde mir klar, dass ich nicht garantieren kann, dass die Zeilen, die ich lösche, die sind, die ich gerade gesichert habe. Oder kann ich ...?

UPDATE: Eine weitere Option, die ich in Betracht gezogen hatte, war einen Schritt hinzuzufügen:

  1. WÄHLE TOP 1000 Zeilen, die meine Datumskriterien erfüllen, in eine temporäre Tabelle
  2. Beginnen Sie mit der Transaktion
  3. Einfügen aus der temporären Tabelle in die Archivtabelle
  4. Löschen Sie aus der Quellentabelle und verbinden Sie sich über jede Spalte mit der temporären Tabelle
  5. Commit-Transaktion
  6. Wiederholen Sie die Schritte 1-5, bis keine Zeilen mehr vorhanden sind, die das Datumskriterium
  7. erfüllen

Hat jemand eine Idee, wie die Kosten dieser Serie mit einigen der anderen unten besprochenen Optionen verglichen werden könnten?

DETAIL: Ich benutze SQL 2005, da jemand gefragt hat.

    
SqlRyan 14.05.2009, 16:23
quelle

8 Antworten

16

Fügt einfach das Ergebnis von DELETE ein:

%Vor%

Dies ist atomar und konsistent.

    
Remus Rusanu 14.05.2009, 21:18
quelle
4

Verwenden Sie ein INSERT mit einer OUTPUT INTO-Klausel, um die IDs der eingefügten Zeilen zu speichern, und dann DELETE, wenn Sie sich dieser temporären Tabelle anschließen, um nur diese IDs zu entfernen

%Vor%     
KM. 14.05.2009 18:16
quelle
0

Wie wäre es mit:

%Vor%     
Aaron Alton 14.05.2009 16:27
quelle
0

Wie wäre es, nicht alles auf einmal zu machen?

%Vor%

Dann später,

%Vor%

oder das Äquivalent.

Nichts, was Sie bisher gesagt haben, deutet darauf hin, dass Sie eine Transaktion benötigen.

    
John Saunders 14.05.2009 16:27
quelle
0

Haben Sie einen Index für das Datumsfeld? Wenn Sie nicht sql müssen möglicherweise gezwungen, auf eine Tabellensperre zu aktualisieren, die alle Ihre Benutzer sperren, während Ihre Archiv-Anweisungen ausgeführt werden.

Ich denke, dass Sie einen Index benötigen werden, damit diese Operation überhaupt funktioniert! Setzen Sie einen Index auf Ihr Datumsfeld und versuchen Sie es erneut!

    
Noel Kennedy 14.05.2009 16:59
quelle
0

Könnten Sie eine Kopie von Events erstellen, alle Zeilen mit Datum & gt; = x dorthin verschieben, Ereignisse löschen und die Kopie Events umbenennen? Oder kopieren, abschneiden und dann zurückkopieren? Wenn Sie sich ein wenig Ausfallzeit leisten können, wäre dies wahrscheinlich der schnellste Weg.

    
John M Gant 14.05.2009 17:50
quelle
0

Folgendes habe ich getan:

%Vor%

Ich ziehe nicht genau 1000, nur 1000, also behandelt es Wiederholungen in der Zeitspalte angemessen (etwas, worüber ich mir Sorgen machte, als ich ROWCOUNT in Erwägung zog). Da es in der Zeitspalte oft Wiederholungen gibt, sehe ich, dass es sich regelmäßig um 1002 oder 1004 Zeilen / Iteration bewegt, also weiß ich, dass es alles bekommt.

Ich gebe das als eine Antwort ein, damit es gegen die anderen Lösungen beurteilt werden kann, die Leute zur Verfügung gestellt haben. Lassen Sie mich wissen, ob etwas mit dieser Methode nicht stimmt. Danke für Ihre Hilfe, alle, und ich werde akzeptieren, welche Antwort in ein paar Tagen die meisten Stimmen hat.

    
SqlRyan 14.05.2009 19:27
quelle
0

Eine weitere Option wäre das Hinzufügen einer Triggerprozedur zur Ereignistabelle, die nichts anderes tut, als den gleichen Datensatz zur Tabelle EventsBackup hinzuzufügen.

Auf diese Weise ist das EventsBackup immer auf dem neuesten Stand und alles, was Sie tun, ist das regelmäßige Löschen von Datensätzen aus Ihrer Ereignistabelle.

    
Ron Savage 14.05.2009 19:38
quelle

Tags und Links