Query-Optimierung ist der Prozess, mit dem eine Datenbank aus einer SQL-Anfrage den effizientesten Ausführungsplan auswählt. Moderne Systeme schätzen dafür die Kosten verschiedener Pläne und wählen den günstigsten — ohne dass der Entwickler die Abfrage umschreiben muss.
Der Cost-Based Optimizer
Der Query-Optimierer vergleicht mögliche Pläne anhand geschätzter Kosten (CPU-Zeit, Platten-I/O, Speicher). Grundlage sind Statistiken über die Tabellen: Zeilenzahlen, Verteilungen und Index-Selektivität. Daraus schätzt er die Kardinalität — wie viele Zeilen ein Zwischenschritt voraussichtlich liefert. Schlechte oder veraltete Statistiken führen zu schlechten Plänen; deshalb sollten sie regelmäßig aktualisiert werden.
Klassische Optimierungstechniken
- Join-Reihenfolge: Kleine Tabellen zuerst — der Optimierer sortiert die Verbindungsreihenfolge nach geschätzter Selektivität.
- Index-Nutzung: Passende Indizes verwandeln komplette Tabellenscans in gezielte Zugriffe.
- Predicate Pushdown: Filter werden möglichst früh angewendet, damit weniger Zeilen durch die Pipeline laufen.
- Partition Pruning: Bei partitionierten Tabellen werden nur die relevanten Bereiche gelesen.
- Query Rewrite: Die Anfrage wird in eine äquivalente, günstigere Form überführt — und kann auf materialisierte Sichten umgeleitet werden.
Von der Theorie zur Praxis
Zeigt der Ausführungsplan (EXPLAIN) einen teuren Sequential Scan oder eine ungünstige Join-Reihenfolge, hilft meist eine Kombination: passende Indizes anlegen, Statistiken aktualisieren, Abfragen vereinfachen oder für sehr aufwendige Auswertungen auf vorberechnete Strukturen wie materialisierte Sichten setzen. Gerade im OLTP- und Data-Warehouse-Betrieb entscheidet die Query-Optimierung über den Unterschied zwischen Sekundenbruchteilen und minutenlangen Wartezeiten.
Verwandte Grundlagen: Ausführungsplan (EXPLAIN), Materialisierte Sicht, Datenbank-Indizes, SQL, Spaltenorientierte Datenbank.