Ich habe ungefähr 84 Millionen Zeilen. Von diesen müssen alle in eine separate Datenbank auf demselben Server übertragen werden. Dann lösche ich, um ungefähr 60 Millionen Zeilen aus der Quellendatenbank zu löschen.
Die 84 Millionen Zeilen befinden sich alle in derselben Tabelle. Allein diese Tabelle macht 90% der gesamten Datenbank aus.
Also ... Quelle: 84 Millionen Zeilen -> 24 Millionen Zeilen Ziel: 0 Zeilen -> 84 Millionen Zeilen
Die Quelle wird im vollständigen Wiederherstellungsmodus ausgeführt, das Ziel wird einfach ausgeführt.
Ich frage mich, was der effizienteste Weg wäre, dies zu tun.
Plan A:
1) INSERT INTO Ziel SELECT * FROM Quelle
2) TRUNCATE-Quelle
3) INSERT INTO source SELECT * FROM Ziel WHERE keep_condition = 1
Plan B:
1) Stellen Sie eine Sicherung der Quellendatenbank als Zieldatenbank wieder her
2) Löschen Sie alle Tabellen mit Ausnahme der in der Zieldatenbank benötigten
3) TRUNCATE-Quelle
4) INSERT INTO source SELECT * FROM Ziel WHERE keep_condition = 1
Plan C:
1) INSERT INTO Ziel SELECT * FROM Quelle
2) DELETE source WHERE keep_condition = 0
oder etwas anderes?
Vielen Dank
quelle
Antworten:
Ich würde hinzufügen, dass Sie diese Transaktionen stapeln müssen , auch wenn Sie sich dazu entschließen . Ich hatte in letzter Zeit sehr viel Glück mit dem verlinkten Artikel und ich schätze die Art und Weise, wie Indizes im Gegensatz zu den meisten Batch-Lösungen, die ich sehe, genutzt werden.
Selbst wenn sie nur minimal protokolliert werden, handelt es sich um große Transaktionen , und Sie könnten viel Zeit damit verbringen, sich mit den Folgen eines abnormalen Protokollwachstums (VLFs, Abschneiden, richtige Größe usw.) zu befassen.
Vielen Dank
quelle
"Effizient" kann für die Verwendung von Protokolldateien, die E / A-Leistung, die CPU-Zeit oder die Ausführungszeit gelten.
Ich würde versuchen, einen minimal protokollierten Vorgang zu erreichen, der aus Sicht der Protokollierung ziemlich effizient wäre. Dies sollte Ihnen einige Ausführungszeiten und einen Bonus ersparen. Wenn Sie über den temporären Speicherplatz verfügen, funktioniert möglicherweise Folgendes für Sie.
Damit ein minimal protokollierter Vorgang ausgeführt werden kann, müssen eine Reihe von Bedingungen erfüllt sein, einschließlich der derzeit ausgeführten Sicherungen, der Datenbank, die auf den
BULK_LOGGED
Wiederherstellungsmodus eingestellt ist, und abhängig von Ihren Indizes muss die Zieltabelle möglicherweise leer sein. Einige dieser Verhaltensweisen haben sich auch von SQL Server 2005 auf 2008 geändert (verbessert).Andererseits können alle anderen Optionen, ohne die Besonderheiten Ihrer Tabelle und Ihrer Daten zu kennen, eine bessere Leistung erbringen. Versuchen Sie es mit
.. und sehen, welche am besten funktioniert.
BEARBEITEN : Wenn Sie massenprotokollierte Vorgänge ausführen, stellen Sie sicher, dass Sie vor und nach dem Vorgang eine Sicherung (Voll- oder Transaktionsprotokoll) erstellen, wenn Sie zu einem bestimmten Zeitpunkt eine Wiederherstellungsfunktion benötigen und den Verdacht haben, dass andere Aktivitäten in der Datenbank unter ausgeführt werden zur gleichen Zeit, zu der Ihr ETL-Job ausgeführt wird.
Ich habe vor einiger Zeit einen Blog-Beitrag über minimal protokollierte Vorgänge geschrieben. Dort finden Sie Links zu anderen Beiträgen und Dokumentationen.
quelle
BULK_LOGGED
Modus Backups zu erstellen . Vielen Dank!Warum nicht BCP?
Öffnen Sie die Eingabeaufforderung
bcp server.sourcedb.table out Filename.flt -T -c
bcp "SELECT * FROM sourcedb.table WHERE keep_condition = 1" queryout Filename2.flt -T -c
bcp Server.destinationdb.table in Filename.flt -T -c -b1000
Überprüfen Sie die Daten
bcp server.sourcedb.table in Filename2.flt -T -c -b1000
quelle
Denken Sie nicht, dass Sie empfehlen sollten, das Wiederherstellungsmodell vorher und nachher ohne vollständige Datenbanksicherung oder T-Log-Sicherung zu ändern . Eine der Funktionen des BULK_LOGGED-Wiederherstellungsmodells besteht darin, dass Sie nicht mehr in der Lage sind, zu einem bestimmten Zeitpunkt eine Wiederherstellung für T-Protokolle durchzuführen, die massenprotokollierte Vorgänge enthalten. Klassisches Szenario: nächtliche vollständige Sicherung, stündliche T-Log-Sicherungen. Sie ändern das Wiederherstellungsmodell in "Massenprotokolliert" und starten den Vorgang. Es läuft etwas schief und die Transaktion wird zurückgesetzt (oder Sie haben noch keine verwendet). Sie sind sich jedoch nicht sicher, was sonst noch in der Datenbank vor sich ging, und möchten daher einen bekannten guten Punkt wiederherstellen.
Wann können Sie wiederherstellen? Letzte stündliche T-Log-Sicherung, die keine Massenprotokollierungsvorgänge enthält und möglicherweise n Minuten an Transaktionen verliert. Eine vollständige Sicherung oder T-Log-Sicherung vor dem Ändern des Wiederherstellungsmodells erstellt einen Fallback-Punkt. Welches Sie wählen, hängt von Ihrer RTO ab.
quelle
Das Löschen von Partitionen aus einer Tabelle ist eine sehr schnelle und ressourcenschonende Methode, um große Datenmengen aus einer Tabelle zu entfernen. Wäre diese Tabelle so partitioniert, dass Ihre Quell- / Zielaufteilung unterstützt wird, besteht die Antwort darin, eine Kopie wiederherzustellen, die redundanten Tabellen und redundanten Partitionen vom Ziel zu löschen und die komplementären Partitionen von der Quelle zu löschen.
Die Kosten für die Aktivierung der Partitionierung können dies jedoch insgesamt zu einem teureren Vorgang machen.
quelle