Eine langsame Datenbankabfrage lässt sich erst sinnvoll verbessern, wenn Sie ihre Aufgabe und ihren Ausführungsplan kennen. Halten Sie die Abfrage, die Parameter und die Größe des betroffenen Bestands fest. Ein Index ist eine mögliche Maßnahme, keine allgemeine Lösung für jede langsame Seite.
Mit einem Plan beginnen
EXPLAIN zeigt den vom Planer gewählten Ablauf. Die Kosten darin sind Schätzwerte und keine gemessenen Millisekunden. Im Beispiel muss die Tabelle benutzer mit dem Feld benutzername bereits existieren.
-- Verwenden von EXPLAIN mit einer einfachen Abfrage
EXPLAIN SELECT * FROM benutzer WHERE benutzername = 'MaxMustermann';
Untersuchen Sie Filter, Join-Schritte und Sortierungen. Wenn Sie tatsächliche Laufzeiten und Zeilenzahlen benötigen, führt EXPLAIN ANALYZE die Abfrage aus. Verwenden Sie es mit Bedacht: Auch eine Änderung von Daten würde dabei ausgeführt. Für die Untersuchung eignet sich eine kontrollierte Testumgebung mit passenden Daten.
Einen Index aus der Abfrage ableiten
Die Suche nach einem Benutzernamen ist ein einfaches Beispiel für einen möglichen Index. Prüfen Sie vor dem Anlegen, ob bereits ein passender Index oder eine Eindeutigkeitsbedingung existiert.
-- Einen Index für die Spalte 'benutzername' in der Tabelle 'benutzer' erstellen
CREATE INDEX idx_benutzername ON benutzer (benutzername);
Der Nutzen hängt unter anderem von Datenverteilung und Ergebnismenge ab. Ein sequentieller Scan kann bei einer kleinen Tabelle oder einer breiten Auswahl sinnvoll sein. Jeder zusätzliche Index benötigt Speicher und muss bei Datenänderungen gepflegt werden. Übertragen Sie deshalb einen Befund aus einem kleinen Beispiel nicht ungeprüft auf die Produktion.
Das Ergebnis mit derselben Aufgabe kontrollieren
Vergleichen Sie den Plan und die Laufzeit vor und nach der Änderung mit denselben fachlichen Eingaben. Berücksichtigen Sie sowohl häufige als auch seltene Suchwerte. Prüfen Sie, ob Statistiken zur aktuellen Datenlage passen und ob gleichzeitig andere Zugriffe oder Wartungsarbeiten stattfinden.
Dokumentieren Sie den gemessenen Engpass, die gewählte Änderung und ihren Effekt. So bleibt die Entscheidung nachvollziehbar, wenn sich der Bestand oder die Abfrage später verändert.
Weiterführende Dokumentation: PostgreSQL: Using EXPLAIN.