| 

.NET C# Java Javascript Exception

0
Hallo,

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.

Danke euch
News:
03.09.2009
qwertz 107 1 2 4
3 Antworten
2
Hallo qwertz,

die Id Felder sollten ja einen Index haben
wie wäre es mit einem Index auf das Feld Logs.Class

Herzliche Grüße
03.09.2009
Lars Schmitt 371 1 4
JA habe ich gemacht. Danke
qwertz 04.09.2009
2
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.
04.09.2009
FalkP 3,3k 3 8
0
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;
07.09.2009
Marcel 21 1 1

Stelle deine Sql-Frage jetzt!