Im Gegensatz zur insert
- hat die delete
-Anweisung eine where
-Klausel, die von Indizierung profitieren kann. Dazu bedient sich die Datenbank aller in Kapitel 2, „Die Where-Klausel“, beschriebenen Methoden. Die Performance ist also wie bei einem select
mit einem zusätzlichen Schritt, um die gefundenen Zeilen zu löschen.
Das eigentliche Löschen einer Zeile erfordert ähnliche Schritte wie das Einfügen einer neuen Zeile. Das ist insbesondere auch das Aktualisieren der Indizes. Damit hängt die Performance ebenfalls stark von der Anzahl der Indizes ab. Die Ähnlichkeit ist in Abbildung 8.2 gut zu erkennen.
Abbildung 8.2 Delete-Performance abhängig von der Indexzahl

Theoretisch würde man das Optimum – wie bei insert
auch – beim Löschen aus einer Tabelle ohne Index erwarten. Dafür muss die Datenbank die Tabelle aber vollständig lesen, um die zu löschende Zeile zu finden – schließlich gibt es keinen Index. Das heißt, dass das Löschen zwar schnell wäre, die Suche aber sehr langsam. Daher ist dieser Fall in Abbildung 8.2, „Delete-Performance abhängig von der Indexzahl“ nicht dargestellt.
Dennoch kann es Sinn machen, eine delete
-Anweisung ohne Index auszuführen. Genauso wie es Sinn machen kann, eine select
-Abfrage ohne Index auszuführen, wenn sie einen großen Teil der Tabelle liefert.
Tipp
Auch delete
- und update
-Anweisungen haben einen Ausführungsplan.
Eine delete
-Anweisung ohne where
-Klausel ist das naheliegende Beispiel dafür. Das ist aber ein Spezialfall, für den es sogar ein eigenes SQL-Kommando gibt: truncate table
. Die truncate table
-Anweisung hat denselben Effekt wie eine delete
-Anweisung ohne where
-Klausel, löscht aber alle Zeilen auf einmal. Das ist zwar extrem schnell, hat aber zwei wichtige Nebenwirkungen: (1) es erfolgt ein implizites commit
(Ausnahmen: PostgreSQL und SQL Server); (2) es werden keine Trigger ausgeführt.