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

Die effizienteste Methode zum Verschieben von Tabellenzeilen von einer Tabelle in eine andere

Eine andere Lösung besteht darin, mehrere Schemas zu verwenden und Switch-a-roo zu spielen. Ich bevorzuge diese Methode nur, weil ich diesen Trick früher in einem Job gemacht habe und die Warnmeldung zum Umbenennen eines Objekts (die nicht unterdrückt werden kann) meine Verlaufsprotokolle füllte. Grundsätzlich benötigen Sie zwei zusätzliche Schemata (eines, um vorübergehend eine Kopie der Tabelle zu speichern, und eines, um die zwischengespeicherte Kopie zu speichern).

CREATE SCHEMA cache AUTHORIZATION dbo;
CREATE SCHEMA hold  AUTHORIZATION dbo;

Erstellen Sie nun ein Abbild der Tabelle im Cache-Schema:

SELECT * INTO cache.table FROM dbo.table WHERE 1 = 0;
-- then create any indexes etc.

Wenn es nun an der Zeit ist, die Daten zu aktualisieren:

-- step 1:
TRUNCATE TABLE cache.table;
-- (if you need to maintain FKs you may need to delete)
INSERT INTO cache.table SELECT ...

-- step 2:
-- this transaction will be almost instantaneous, 
-- since it is a metadata operation only: 

BEGIN TRANSACTION;
  ALTER SCHEMA hold  TRANSFER dbo.table;
  ALTER SCHEMA dbo   TRANSFER cache.table;
  ALTER SCHEMA cache TRANSFER hold.table;
COMMIT TRANSACTION;

Theoretisch könnten Sie die letzte Überweisung aus der Transaktion verschieben, weil Benutzer können Fangen Sie an, die neue Kopie von dbo.table nach der zweiten Übertragung abzufragen, aber wie gesagt, dies geschieht fast augenblicklich, daher wäre ich überrascht, wenn Sie einen Unterschied in der Parallelität feststellen würden.

Sie könnten cache.table optional auch kürzen hier noch einmal, aber ich habe es immer gefüllt gelassen, damit ich Datenänderungen vergleichen oder Fehler beheben kann, wenn etwas schief gelaufen ist. Je nachdem, wie lange Schritt 1 dauert, kann es schneller sein, die Übertragungen in umgekehrter Reihenfolge durchzuführen, als von Grund auf neu zu füllen.

Wie bei der Umbenennung können Sie bei diesem Vorgang schiefe Dinge bekommen, wie z. B. Statistiken, die verloren gehen, wenn sie sich mit der eigentlichen Tabelle bewegen, sie bleiben nicht beim Namen. Und wie beim Umbenennen möchten Sie dies testen und vielleicht mit Isolationsstufen herumspielen, z. RCSI für den Zugriff auf die Berichtstabelle.