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:
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.
Fügt einfach das Ergebnis von DELETE ein:
%Vor%Dies ist atomar und konsistent.
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.
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!
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.
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.
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.
Tags und Links sql-server insert rowcount