Ziehen Sie in Betracht, eine neue Tabelle mit demselben Schema und der Zeilenversionsspalte zu erstellen, und fügen Sie auf beiden Tabellen eine Ansicht hinzu, die alle zusammenfasst. Lassen Sie die Ansicht von Personen verwenden und schreiben Sie anstelle von Triggern auf die zugrunde liegenden Tabellen und Ansichten.
Einfügungen sollten an die neue Tabelle gesendet werden, Aktualisierungen sollten Daten in die neue Tabelle verschieben und Löschungen sollten auf beide Tabellen angewendet werden.
Führen Sie dann Stapelverschiebungen im Hintergrund aus und verschieben Sie so viele Datensätze wie möglich gleichzeitig in die neue Tabelle. Währenddessen kann es immer noch zu Problemen mit der Parallelität und einigen spektakulären Ausführungsplänen kommen. Sie können jedoch online bleiben, während die Umzüge stattfinden.
Im Idealfall starten Sie den Prozess an einem Freitagnachmittag, um die Auswirkungen auf die Endbenutzer zu minimieren, und versuchen, dies vor Montagmorgen zu erledigen. Sobald es eingerichtet ist, können Sie die Ansicht so ändern, dass sie nur auf die neue Tabelle verweist, und die spektakulären Ausführungspläne werden nicht mehr angezeigt. Im Idealfall.
Um zu vermeiden, dass die Trigger ausgelöst werden, wenn die Daten in Stapeln migriert werden, überprüfen Sie die Anzahl der Zeilen in den gelöschten / eingefügten Tabellen im Trigger und überspringen Sie die Aktivitäten, wenn sie der Anzahl der Zeilen in Ihrem Stapel nahekommen.
Im Ziel beschloss Michael, die Ansicht zu überspringen (und nicht aus der Originaltabelle zu löschen), um stabilere Pläne zu erhalten. Der Kompromiss bestand im Wesentlichen aus zwei Kopien der Tabelle. Er verwandelte es in eine Reihe von Blog-Posts .
Wenn
TIMESTAMP
Sie Folgendes hinzufügenNULLABLE
:VARBINARY(8)
Spalte hinzuNach dem Auffüllen
DROP
derVARBINARY(8)
Spalte , die Sie gerade hinzugefügt und ausgefüllt haben, und Hinzufügen derTIMESTAMP NULL
Spalte in Back-to-Back-SQL-Anweisungen .Wenn
TIMESTAMP
Sie Folgendes hinzufügenNOT NULLABLE
:BINARY(8)
Spalte hinzuNach dem Auffüllen
DROP
derBINARY(8)
Spalte , die Sie gerade hinzugefügt haben, und der Spalte , die Sie aufgefüllt haben, in den SQL-Anweisungen "back to back"ADD THE TIMESTAMP NOT NULL
.quelle