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_product
small_table.id_product
small_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.
"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?