Sehr langsame Abfrage LÖSCHEN

Habe ich Probleme mit der SQL-Leistung. Für plötzliche Grund der folgenden Abfragen sehr langsam:

Ich habe zwei Listen enthält die Id einer bestimmten Tabelle. Wie lösche ich alle Datensätze aus der ersten Liste, wenn die Id bereits vorhanden ist in der zweiten Liste:

DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)

-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id

-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)

Ist es möglich, die zwei Listen enthält mehr als 10.000 Datensätze. In diesem Fall werden beide Abfragen dauert jeweils mehr als 20 Sekunden ausgeführt werden.

Den Ausführungsplan zeigte auch etwas, was ich nicht verstehe. Vielleicht erklärt warum es so langsam ist:
Sehr langsame Abfrage LÖSCHEN

Füllte ich die beiden Listen mit 10.000 sequenziell ganze zahlen, so dass beide Liste enthaltenen Wert 1-10.000 als Ausgangspunkt.

Wie Sie sehen können beide Abfragen zeigt für @IdList2 die Tatsächliche Anzahl von Zeilen ist 50.005.000!!. @IdList1 korrekt ist (die Tatsächliche Anzahl von Zeilen ist 10.000)

Ich weiß, es gibt andere Lösungen wie man dieses Problem lösen. Wie füllen Sie eine Dritte Liste nur das entfernen aus der ersten Liste. Aber meine Frage ist:

Warum sind diese delete-Anfragen so langsam und warum sehe ich diese seltsame Abfrage-Pläne?

  • Ist das ein problem, dass vielleicht auftreten in einem realen Szenario, oder, gerade in dieser specilaized situation?
  • Die zugrunde liegenden Probleme keine Statistiken kompiliert Sie für table-Variablen (und Mangel an nützlichen Indizes auf Ihnen) ist sehr Häufig.
InformationsquelleAutor hwcverwe | 2013-05-23
Schreibe einen Kommentar