Folgender Query dauert ewig, wenn viele Zeilen betroffen sind. Hat jemand einen Optimierungsvorschlag und kann mir sagen wieso die Ausführung so lange dauert?
update Logs set Logs.ClassID = Persons.ID from Logs INNER JOIN Persons on Logs.ClassID = Persons.OldID where Logs.Class = 'Person'
Gemacht werden soll folgendes. In das Attribut ClassID soll die neue PersonenID reingeschrieben werden, und zwar nur für die Klasse Person. Das Verknüpfung geschieht über den alten Key.
Eine pauschale Antwort warum dieses UPDATE lange dauert ist schwer. Es gibt viele Möglichkeiten die ein UPDATE verlangsamen können. Wieviele Indizes sind von dem Update betroffen (diese müssen ebenfalls geändert werden)? Liegen Trigger auf der geänderten Tabelle, die zusätzlichen Performanceverlust bringen? Wie schnell ist eine Abfrage mit gleichem JOIN und Where-Bedingung?
Ich vermute die "Bremse" am ehesten darin, dass ein Feld geändert wird, welches gleichzeitig als Referenz im JOIN verwendet wird. Hier muß der Server u.U. viel Redo-Information schreiben, um die Transaktionskonsistenz aufrechtzuerhalten, gerade wenn viele DS betroffen sind. Mglws. bringt es etwas die Abfrage anders zu formulieren. Etwa so:
update Logs set Logs.ClassID = ( select Persons.ID from Persons where Persons.OldID = Logs.ClassID) from Logs where Logs.Class = 'Person' and exists ( select 'X' from Persons where Persons.OldID = Logs.ClassID)
Die gejointen ID-Felder sollten in jedem Fall einen Index besitzen.
Je nachdem welche Datenbank du benutzt hilft auch das Aussparen der schon gesetzen Werte:
UPDATE Logs set Logs.ClassID = Persons.ID FROM Logs INNER JOIN Persons ON Logs.ClassID = Persons.OldID WHERE Logs.Class = 'Person' AND Logs.ClassID != Persons.ID;
Wenn mich nicht alles täuscht sollte auch die folgende Abfrage das gewünschte Ergebnis bringen:
UPDATE Logs SET Logs.ClassID = Persons.ID FROM Persons WHERE Logs.ClassID = Persons.OldID AND Logs.Class = 'Person' AND Logs.ClassID != Persons.ID;