Frage

Ich stelle zusammen einen Job auf SQL Enterprise Manager 2000, um Datensätze in ein paar Datenbank-Tabellen zu kopieren und löschen. Wir haben eine gerade nach oben Massenkopie laufen und gespeicherte Prozedur löschen, aber es könnte es auf Millionen von Zeilen ausgeführt werden, und deshalb hängt der Server. Ich war daran interessiert, den Service in 100-ish Rekord Brocken zu einem Zeitpunkt ausgeführt werden, so dass der Server mahlt nicht zum Stillstand (dies ist eine Live-Web-Datenbank). Ich möchte diesen Service einmal in der Nacht laufen zu lassen, weshalb ich es in einem Agenten Job gesetzt haben. Gibt es eine Möglichkeit die Anrufe an die gespeicherten Prozeduren in einer Schleife, die tatsächlich die Kopie tun und löschen, und dann „Schlaf“ in zwischen jedem Aufruf der Server-Zeit zu geben, um aufzuholen? Ich weiß, es ist der WAITFOR-Befehl, aber ich bin nicht sicher, ob dies den Prozessor halten oder lassen Sie es andere Abfragen in der Zwischenzeit laufen.

Danke!

War es hilfreich?

Lösung

„Chunkifying“ Ihre Löschungen ist der bevorzugte Weg, große Mengen an Daten zu löschen, ohne Transaktionsprotokolldateien Blähungen auf. BradC der Post ist ein vernünftiges Beispiel.

Verwalten solcher Schleifen wird am besten in einer einzigen gespeicherten Prozedur durchgeführt. Zur Verbreitung solchen Arbeit im Laufe der Zeit, würde ich noch immer in dem Verfahren. eine WAITFOR in der Schleife einfügen wird eine „Pause“ zwischen jedem Satz von Löschungen setzen, wenn Sie halten, dass die erforderlich ist möglich Concurrency Probleme zu behandeln. Verwenden Sie einen SQL-Agent-Auftrag, um zu bestimmen, wenn die Prozedur starten -. Und wenn Sie sicher brauchen, um es durch eine gewisse Zeit anhält, arbeitet, dass in die Schleife als auch

Meine Spin auf diesem Code wäre:

--  NOTE: This is a code sample, I have not tested it
CREATE PROCEDURE ArchiveData

    @StopBy DateTime
    --  Pass in a cutoff time.  If it runs this long, the procedure will stop.
AS

DECLARE @LastBatch  int

SET @LastBatch = 1
--  Initialized to make sure the loop runs at least once


WHILE @LastBatch > 0
 BEGIN

    WAITFOR DELAY '00:00:02'
    --  Set this to your desired delay factor

    DELETE top 1000  --  Or however many per pass are desired
     from SourceTable
    --  Be sure to add a where clause if you don't want to delete everything!

    SET @LastBatch = @@rowcount

    IF getdate() > @StopBy
        SET @LastBatch = 0

 END

RETURN 0

Hmm. Rereading bedeutet, dass Sie schreiben, dass Sie die Daten irgendwo zuerst vor dem Löschen kopieren möchten. Um das zu tun, würde ich eine temporäre Tabelle einrichten und innerhalb der Schleife zuerst die temporären Tabelle gestutzt, kopiert Sie dann in dem Primärschlüssel der TOP N Artikel, fügen Sie in die „Archiv“ Tabelle über eine Verknüpfung zu der temporären Tabelle, dann löschen Sie die Quelltabelle über eine auch für die temporäre Tabelle verbinden. (Nur ein bisschen komplexer als eine gerade löschen, ist es nicht?)

Andere Tipps

Sorgen Sie sich nicht zwischen den Schleifen über das Warten, SQL Server die Konkurrenz zwischen Ihrem Instandhaltungsauftrag und die regelmäßige Aktivität auf dem Server verarbeiten soll.

Was wirklich verursacht das Problem in solchen Situationen ist, dass der gesamte Löschvorgang auf einmal geschieht, innerhalb einer einzigen Transaktion. Dies bläst das Protokoll für die Datenbank und kann die Arten von Problemen verursachen, es klingt wie Sie erleben.

Verwenden Sie eine Schleife wie dies in überschaubaren Einheiten zu löschen:

DECLARE @i INT
SET @i = 1

SET ROWCOUNT 10000

WHILE @i > 0
BEGIN
    BEGIN TRAN
        DELETE TOP 1000 FROM dbo.SuperBigTable
        WHERE RowDate < '2009-01-01'
    COMMIT

    SELECT @i = @@ROWCOUNT
END
SET ROWCOUNT 0

Sie können mit ähnlicher Logik für Ihre Kopie.

WAITFOR lassen andere Prozesse 'have a go'. Ich habe diese Technik verwendet, um zu stoppen große DELETE ist die Maschine aufzuhängen. Erstellen Sie eine While-Schleife, löschen Sie einen Block von Zeilen und waitfor dann ein paar Sekunden (oder weniger, was angemessen ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top