Auswirkungen der Systemlast


Die Überlegungen beim Anlegen eines mehrspaltigen Indexes enden meist, sobald der Index für die gewünschte Abfrage benutzt wird. Der Optimizer verwendet ihn aber nicht, weil er für die Abfrage „richtig“ ist. Es genügt, dass der Indexzugriff besser als ein Full-Table-Scan ist. Das heißt keines­wegs, dass der Index die Abfrage optimal unterstützt.

Das vorherige Beispiel hat gezeigt, wie schwierig es ist, eine falsche Spal­ten­reihen­folge im Ausführungsplan zu erkennen. Die Prädikatsinformationen sind oft so gut versteckt, dass man schon gezielt danach suchen muss, um zu wissen, ob der Index optimal verwendet wird.

Im SQL Server Management Studio werden die Prädikatsinformationen zum Beispiel nur als Tool-Tip angezeigt, wenn man den Mauszeiger auf eine Index-Operation bewegt („hover“) – auch auf dieser Webseite. Im folgenden Ausführungsplan wird der Index SCALE_SLOW verwendet. Daher scheint die Bedingung auf ID2 als Filterprädikat („Predicate“, ohne Seek) auf.

Abbildung 3.3. Prädikatsinformation im Tool-Tip


Bei MySQL und PostgreSQL ist es noch mühsamer, herausfinden, welche Bedingungen Zugriffs- oder Filterprädikate sind. Die Details finden sich in Anhang A.

Die Prädikatstypen können im Ausführungsplan noch so unscheinbar sein, sie haben eine enorme Auswirkung auf die Performance – vor allem, wenn das System wächst. Es wächst nämlich nicht nur das Datenvolumen, wie im vorigen Abschnitt dargestellt, sondern hoffentlich auch die Zugriffsrate. Sie ist natürlich auch eine Variable im Skalierungsverhalten einer Datenbank.

Für alle Anwendungsentwickler […] sollte der schmale Band […] eine Pflichtlektüre sein — ADMIN-Magazin

Die folgende Abbildung zeigt daher die Antwortzeit als Funktion der Zugriffsrate – das Datenvolumen bleibt konstant. Dafür wurde die Abfrage des vorherigen Abschnittes mit dem maximalen Datenvolumen verwendet. Das heißt, der letzte Punkt aus Abbildung 3.2 entspricht dem ersten Punkt in diesem Chart.

Abbildung 3.4. Antwortzeit als Funktion der Systemlast


Die gestrichelte Linie zeigt die Antwortzeit mit dem Index SCALE_SLOW. Bei 25 gleichzeitigen Abfragen steigt die Antwortzeit auf 32 Sekunden. Im Vergleich zur Geschwindigkeit ohne Hintergrundaktivität – wie es zum Beispiel in einer Entwicklungsumgebung sein könnte – dauert die Abfrage 30-mal so lange. Selbst wenn man den vollen Datenbestand in der Entwicklungsumgebung hat, kann die Abfrage im Produktionssystem immer noch um Faktoren langsamer sein.

Die zweite Linie zeigt den Verlauf der Antwortzeit mit dem Index SCALE_FAST – also ohne Filterprädikat. Dadurch bleibt die Antwortzeit stets unter 2 Sekunden – selbst wenn 25 Abfragen gleichzeitig laufen.

Beachte

Das sorgfältige Lesen des Ausführungsplanes gibt mehr Sicherheit als oberflächliche Tests.

Ein voller Stresstest ist dennoch wertvoll, aber viel aufwendiger.

Auffällige Antwortzeiten werden während der Entwicklung oft „auf die leichte Schulter genommen“. Meistens, weil man von der „viel stärkeren Produktionshardware“ bessere Performance erwartet. Das Produktions­system ist aber häufig komplexer – dadurch können sich zum Beispiel Latenzen akkumulieren, die in der Entwicklungsumgebung nicht auf­tre­ten. Selbst wenn das Testsystem produktionsäquivalent ist, hat man in der Produktion eine andere Hintergrundlast und damit andere Antwortzeiten. Im nächsten Abschnitt werden wir sehen, dass es ganz generell keine gute Idee ist, von „größerer Hardware“ schnellere Antworten zu erwarten.

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

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