von Markus Winand.

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, „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ü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.

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

Foto von Markus Winand

Markus Winand lehrt effizientes SQL – inhouse und online. Er minimiert die Entwicklungszeit durch modernes SQL und optimiert die Laufzeit durch schlaue Indizierung – dazu hat er auch das Buch SQL Performance Explained veröffentlicht.

Sein Buch bei Amazon kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Bei Amazon kaufen
(Taschenbuch)

Taschenbuch und PDF auch auf Markus' Webseite erhältlich.

Sein Training

Sein beliebtes Training stimmt Entwickler auf SQL Performance ein.

Erfahren Sie mehr»

„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz | CC-BY-NC-ND 3.0 Lizenz