SQL Server DELETE ist langsamer mit Indizes

Ich besitze eine SQL Server 2005-Datenbank und habe versucht, die entsprechenden Felder mit Indizes zu versehen, um das @ zu beschleunigeDELETE von Datensätzen aus einer Tabelle mit Millionen von Zeilen big_table hat nur 3 Spalten), aber jetzt dasDELETE Ausführungszeit ist geradelänge! (1 Stunde versus 13 Minuten zum Beispiel)

Ich habe eine Beziehung zwischen Tabellen und der Spalte, in der ich mein @ filterDELETE by steht in der anderen Tabelle. Beispielsweis

DELETE FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)

Btw, ich habe es auch versucht:

DELETE FROM big_table
WHERE EXISTS
(SELECT 1 FROM small_table
WHERE small_table.id_product = big_table.id_product
AND small_table.id_category = 1)

und obwohl es etwas schneller zu laufen scheint als das erste, ist es mit den Indizes immer noch viel langsamer als ohne.

Ich habe Indizes für diese Felder erstellt:

big_table.id_productsmall_table.id_productsmall_table.id_category

My .ldf-Datei wächst viel während derDELETE.

Warum sind meineDELETE fragt langsamer ab, wenn ich Indizes für meine Tabellen habe? Ich dachte, sie sollten schneller laufen.

AKTUALISIERE

Okay, Konsens scheint zu sein, Indizes werden eine riesige @ verlangsamDELETE weil der Index aktualisiert werden muss. Obwohl ich immer noch nicht verstehe, warum es nicht kannDELETE alle Zeilen auf einmal und aktualisiere den Index am Ende nur einmal.

Ich hatte nach einigen meiner Lektüren den Eindruck, die Indizes würden sich beschleunigenDELETE durch Suchen nach Feldern imWHERE -Klausel schneller.

Odetocode.com sagt:

"Indizes funktionieren bei der Suche nach einem Datensatz in den Befehlen DELETE und UPDATE genauso gut wie bei SELECT-Anweisungen."

Aber später in diesem Artikel heißt es, dass zu viele Indizes die Leistung beeinträchtigen können.

Antworten auf bobs Fragen

55 Millionen Zeilen in der Tabelle 42 Millionen Zeilen werden gelöschtSimilarSELECT Anweisung würde nicht ausgeführt (Ausnahme vom Typ 'System.OutOfMemoryException' wurde ausgelöst)

Ich habe die folgenden 2 Abfragen versucht:

SELECT * FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)

SELECT * FROM big_table
INNER JOIN small_table
ON small_table.id_product = big_table.id_product
WHERE small_table.id_category = 1

Beidegescheiter nach dem Laufen für 25 min mit dieser Fehlermeldung von SQL Server 2005:

An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.

Der Datenbankserver ist ein älterer Dual-Core-Xeon-Computer mit 7,5 GB RAM. Es ist meine Spielzeug-Test-Datenbank :), es läuft also nichts anderes.

Muss ich mit meinen Indizes etwas Besonderes machen, nachdem ichCREATE ihnen, damit sie richtig funktionieren?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage