Wie kann man die Fortschritte von einem SQL-update?
Sagen wir, ich habe ein update wie:
UPDATE [db1].[sc1].[tb1]
SET c1 = LEFT(c1, LEN(c1)-1)
WHERE c1 like '%:'
Dieses update ist im Grunde gehen, durch die Millionen von Zeilen und schneiden Sie den Doppelpunkt, wenn es eine in der c1-Spalte.
Wie kann ich verfolgen, wie weit entlang in der Tabelle diese Fortgeschritten?
Dank
Dies ist sql server 2008
Du musst angemeldet sein, um einen Kommentar abzugeben.
Datenbank-Abfragen, insbesondere Data Manipulation Language (DML), sind atomar. Das bedeutet, dass die INSERT/UPDATE/DELETE entweder erfolgreich Auftritt, oder es funktioniert nicht. Es gibt keine Mittel, um zu sehen, welcher Datensatz bearbeitet wird -- um die Datenbank, die Sie alle war geändert worden, nachdem der COMMIT ausgegeben, nachdem der UPDATE. Selbst wenn Sie waren in der Lage, um die Datensätze in dem Prozess, der durch die Zeit, die Sie sehen würde, den Wert, die Abfrage Fortschritte erzielt haben, auf andere Datensätze.
Das einzige Mittel, um zu wissen, wo ist dabei das Skript für die Abfrage innerhalb einer Schleife, so dass Sie können verwenden Sie einen Zähler, um zu wissen, wie viele verarbeitet werden. Es ist üblich, dies zu tun, so dass große Daten-sets sind in regelmäßigen Abständen verpflichtet, zu minimieren das Risiko des Scheiterns erfordern, dass die gesamte Abfrage wieder.
do
Zustimmen, brechen Sie Sie in Stücke für umfangreiche Datensätze, obwohl für ein nicht-index-freundlich-Abfrage, kann es erforderlich, dass in jeder iteration neu zu überdenken bedeckten Boden (und gehen weiter in der Tabelle)Within minutes, my answer gets voted down
(ja, es ist Sie).Sie können die sysindexes-Tabelle, die Spur hält, wie viel sich ein index geändert hat. Da dies in ein atomarer update, es wird nicht die chance haben, umrechnen Statistiken, so
rowmodctr
wird weiter wachsen. Dies ist manchmal nicht spürbar, in der kleine Tabellen, aber für Millionen, wird sich zeigen.Nun in einer anderen Abfrage, Fenster, führen Sie die unten kontinuierlich und beobachten Sie die rowmodctr-bis und bis.
rowmodctr
vsrows
gibt Ihnen eine Vorstellung, wo Sie sich, wenn Sie wissen, worowmodctr
muss am Ende wird. In unserem Fall ist es 67% von knapp über 2 Millionen.Bitte nicht ausführen (nolock) das zählen von Abfragen auf die Tabelle
itself
während es aktualisiert wird.Nicht wirklich... können Sie Abfragen mit der nolock-Hinweis und gleichen denen, aber das kostet Ressourcen
Ist es nicht eine optimale Abfrage mit einem führenden wildcard-natürlich...)