Delete


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 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.

Tweet this tip

Tipp

Auch delete- und update-Anweisungen haben einen Ausführungs­plan.

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.

Wenn dir gefällt, wie ich die Dinge erkläre, wirst du meine Kurse lieben.

Nebeneffekte von MVCC

Multi-Version-Concurrency-Control (MVCC) ist ein Daten­bank­me­cha­nis­mus, der dafür sorgt, dass sich gleichzeitige Zugriffe gegenseitig nicht blockieren und die Daten einer Transaktion in sich konsistent sind. Bei der Implementierung unterscheiden sich die einzelnen Datenbanken. Das kann sich auch bei der Performance bemerkbar machen kann.

Die PostgreSQL Datenbank führt die Versionsinformation (=Sicht­bar­keits­information) zum Beispiel nur auf Tabellenebene. Die delete-Anweisung muss also nur einen „gelöscht“-Marker in der Tabelle setzten. Daher ist die delete-Performance bei PostgreSQL nicht von der Anzahl der Indizes abhängig. Das physische Löschen sowie das Aktualisieren der Indizes erfolgt erst im Rahmen des Vacuum-Prozesses.

Über den Autor

Photo of Markus Winand
Markus Winand stimmt Entwickler auf SQL-Performance ein. Er hat das Buch SQL Performance Explained veröffentlicht und bietet inhouse Schulungen sowie Tuning-Leistungen auf http://winand.at/ an.