2016-04-15 13 views
0

Ich habe diese Abfrage unten mit 300 Millionen Zeilen in der Tabelle F_SUPPORT_WEB zu aktualisieren, ich bin nicht in der Lage, es auszuführen, jedes Mal, wenn ich bekomme ich ein Transaktionsprotokoll Problem. Ich denke, der Zwischenoperator ist der Schlüssel, aber ich weiß nicht, wie ich ihn optimieren soll.Wie kann ich diese UPDATE-Abfrage schneller ausführen?

Kann mir jemand helfen?

+0

Wie viele Indizes auf Web sind? Möglicherweise müssen Sie die Indexierung deaktivieren und sie zwingen, nach den Updates zu aktualisieren. – xQbert

+0

Es gibt nur einen Index .. – imanebz

+0

Man würde nicht erwarten, ein * Transaktionsprotokoll Problem * zu finden, so dass dies wahrscheinlich eine gute Idee ist. Was ist dein Problem? –

Antwort

1

Wenn Ihr Protokolltabellenlaufwerk nicht groß genug ist, um diese einzelne Transaktion zu unterstützen, müssen Sie es in mehrere Transaktionen aufteilen. Ich hatte ein ähnliches Problem und testete, bis ich einen Sweet Spot fand (100.000 Zeilen für mich aktualisiert). Machen Sie eine Schleife, bis alle Datensätze fertig sind. Sie können dies tun, indem Sie einfach Ihre Abfrage ändern.

Sie könnten das an erster Stelle hinzufügen, um zu sehen, ob Sie unnötige Datensätze aktualisieren.

+0

Danke, das "Wo" hat alles verändert! (y) – imanebz

+0

@imanebz Großartig! Vergessen Sie nicht, nach NULL zu suchen, wenn dies in Ihrem Szenario möglich ist. – UnhandledExcepSean

1

Sie möchten Updates in einer Schleife ausführen. Wenn Sie versuchen, alle diese Datensätze gleichzeitig zu aktualisieren, müssen sie alle im Falle eines Fehlers in das Transaktionsprotokoll kopieren, damit die Änderungen rückgängig gemacht werden können. Wenn Sie Aktualisierungen in Batches durchführen, wird dieses Problem nicht auftreten. Siehe unten

SELECT 1 --Just to get a @@ROWCOUNT established 
WHILE (@@ROWCOUNT > 0) 
BEGIN 
    UPDATE TOP (5000000) WEB --Change this number to however many you want to update at a time 
    SET WEB.ID_D_SUPPORT = DIM.ID_D_SUPPORT 
    FROM dbo.F_SUPPORT_WEB WEB 
    INNER JOIN dbo.D_SUPPORT DIM ON WEB.id_support = DIM.id_support 
       AND (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid) 
    WHERE WEB.ID_D_SUPPORT != DIM.ID_D_SUPPORT --Don't update records that have already been updated, otherwise the loop will run forever 
END 
-1
  1. Temporärtabelle erstellen Dim mit Dim.ids.
  2. Masseneinfügung nur mit ID in temporäre Tabelle DIM mit DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid.
  3. machen eine ohne (WEB.date_creation ZWISCHEN DIM.Date_Deb_Valid UND DIM.Date_Fin_Valid) mit temporären Tabelle beitreten