tsql-bulk-update

MyTableA hat mehrere Millionen Datensätze. In regelmäßigen Abständen wird jede Zeile MyTableA muss aktualisiert werden, mit Werten von TheirTableA.

Leider habe ich keine Kontrolle über TheirTableA und es gibt kein Feld, um anzugeben, ob alles in TheirTableA geändert hat, so dass ich entweder alles neu machen oder ich ein update basierend auf dem Vergleich jedes Feld, das unterschiedlich sein könnte (nicht wirklich machbar, da dies eine lange und Breite Tabelle).

Leider das Transaktionsprotokoll ist eine Ballonfahrt dabei eine gerade update also wollte ich aufteilen, es mit UPDATE TOP, aber wie ich es verstehe, brauche ich ein paar Felder, um zu bestimmen, ob die Datensätze in MyTableA aktualisiert wurden oder noch nicht, sonst werde ich am Ende in einer Endlosschleife:

declare @again as bit;
set @again = 1;

while @again = 1
  begin
    update top (10000) MyTableA
    set my.A1 = their.A1, my.A2 = their.A2, my.A3 = their.A3
    from MyTableA my
    join TheirTableA their on my.Id = their.Id

    if @@ROWCOUNT > 0
      set @again = 1
    else
      set @again = 0
end

ist der einzige Weg, dies funktioniert, wenn ich in ein

where my.A1 <> their.A1 and my.A2 <> their.A2 and my.A3 <> their.A3

dieser scheint, wie es wird schrecklich ineffizient, mit vielen Spalten zu vergleichen

Ich bin sicher, ich bin fehlt eine offensichtliche alternative?

  • "Leider wird das Transaktionsprotokoll Ballonfahren zu tun" - haben Sie regelmäßig Log-sicherungen? Wie oft?
  • Eine offensichtliche Sache, die ich bin fehlt, ist kleben ein updatedAt datetime-Feld auf MyTable, diese mit einem index ist, angemessene Leistung, aber ich würde immer noch interessieren, ob es einen besseren Weg gibt?
  • Gerade über diese Frage von vor 2 Jahren. Sorry, ich wollte nicht akzeptieren, dann Antworten und ich erinnere mich nicht das genaue Ergebnis jedoch von Ihnen positiv bewertet werden und angenommen, wo Sie angeboten habe nützliche info für andere user 🙂
InformationsquelleAutor DannyT | 2011-06-24
Schreibe einen Kommentar