Ich habe eine Reihe von Funktionen, die MOVE von einer Tabelle zur anderen aufzeichnet (im Allgemeinen für eine Form der Archivierung der Daten) und fragte mich, ob es eine "Best Practice" dafür oder eine effizientere Methode als ich derzeit bin verwenden.
Im Moment laufe ich so etwas wie:
%Vor%Dies führt auch zu einer Warnung für die SQL-Leistungssoftware, dass die Abfrage zu Indexunterdrückung und Leistungseinbußen führen kann. aufgrund eines SCAN durchgeführt wird, anstatt ein SEEK.
Es lohnt sich, hinzuzufügen, dass die archive_table eine exakte Kopie der live_table ist, mit der Ausnahme, dass wir die Identität und den Primärschlüssel aus der Spalte [ROWID] entfernt haben und diese Tabelle nicht in der "Live" -Umgebung verwendet wird als die alten Daten eingefügt, wie beschrieben.
[Bearbeiten]
Scheint, dass die Antwort von Alex eine wirklich einfache Lösung dafür bietet; Der Kommentar zur Verwendung eines Triggers löst das Problem in diesem Fall nicht, da das Ereignis einige Tage später auftritt und die Kriterien von Ereignissen während dieses Zeitraums abhängig sind.
%Vor%Wenn Sie eine große Anzahl von Datensätzen von einer Tabelle in eine andere verschieben müssen, sollten Sie die Möglichkeit prüfen, Ihre "aktive Tabelle" zu partitionieren. Jedes Mal kopieren Sie Daten von einer (oder mehreren) Partitionen in die "Tabelle erreichen" und löschen diese Partitionen. Es wird viel schneller sein, als Datensätze aus einer "Online" -Tabelle zu löschen.
Es lohnt sich, hinzuzufügen, dass die archive_table eine exakte Kopie der live_table ist, mit der Ausnahme, dass wir die Identität und den Primärschlüssel aus der Spalte [ROWID] entfernt haben und diese Tabelle nicht in der "Live" -Umgebung verwendet wird als die alten Daten eingefügt, wie beschrieben.
Ich kann nicht sagen, ob Sie den Primärschlüssel aus der archive_table entfernen, weil Sie erwarten, dass die ROWIDs in der live_table wiederverwendet werden.
Wenn ich den Kontext Ihrer Daten richtig verstehe und Sie Tage nach Abschluss der Daten archivieren möchten, können Sie die Leistung der Abfrage verbessern, indem Sie den Vergleich von Zeilen, die in der live_table nicht vorhanden sind, reduzieren / eliminieren . Nachdem eine ROWID von live_table nach archive_table migriert wurde, gibt es keinen Grund mehr danach zu suchen.
Hinweis: Dies setzt voraus, dass ROWIDs nicht in der live_table wiederverwendet werden und immer steigende Zahlen aufweisen.
%Vor%Wenn ROWIDs wiederverwendet werden. Wenn Sie ein Datum / Uhrzeit-Feld in Ihrem Datensatz haben, das nahe an dem Zeitpunkt ist, an dem der Datensatz live war oder archiviert wurde, kann es als Alternative zur ROWID verwendet werden. Dies würde bedeuten, dass Sie nur nach kürzlich archivierten Zeilen suchen, die aus der live_table gelöscht werden sollen, anstatt von der gesamten Menge. Wenn Sie [somedate] den Clustered-Index für die archive_table erstellen, könnte dies auch die Leistung verbessern, da die Daten physisch so angeordnet sind, dass Sie nur das Ende der Tabelle betrachten.
%Vor%Ihr Code-Snippet enthält keine benannte Transaktion, die unbedingt berücksichtigt werden muss. Zweiter Entwurf einer Tabellenvariablen, einer temporären Tabelle oder einer harten Tabelle für die Verwendung als Staging. Die entworfene Tabelle sollte eine Spalte enthalten, deren Datentyp mit der Identitätsspalte aus Ihrer Quellentabelle identisch ist, und diese Spalte sollte indiziert werden. 3. Entwerfen Sie Ihren TSQL, um die Staging-Tabelle aufzufüllen, kopieren Sie Zeilen von der Quellentabelle in die Zieltabelle basierend auf einer Verknüpfung zwischen der Quelle und dem Staging und entfernen Sie dann Zeilen aus der Quellentabelle basierend auf demselben Join, der Daten in die Zieltabelle verschoben hat. Unten ist ein funktionierendes Beispiel
%Vor%Tags und Links sql sql-server-2008