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.

Vorherige SeiteNächste Seite

Du kannst nicht alles an einem Tag lernen. Abonniere den Newsletter via E-Mail, Twitter oder RSS um sukzessive aufzuholen. Und sieh dir auch modern-sql.com an.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

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

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„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 und DSGVO | CC-BY-NC-ND 3.0 Lizenz