An SQL query walks into a bar and sees two tables. He walks up to them and asks “Can I join you?”— Quelle: Unbekannt
Eine Join-Operation transformiert Daten aus einem normalisierten Modell in eine denormalisierte Form, die für eine bestimmte Aufgabe benötigt wird. Da sie verstreute Daten-Fragmente zusammenführt, ist die Geschwindigkeit einer Join-Operation besonders empfindlich auf Festplatten-Latenzen. Auch hier ist eine sorgfältige Indizierung die beste Methode, die Antwortzeiten zu verbessern. Bei einem Join hängt die richtige Indizierung allerdings davon ab, welcher der drei gängigen Algorithmen zur Anwendung kommt.
Hinweis in eigener Sache
Ich biete SQL Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.
Eines gilt aber für alle Join-Algorithmen gleichermaßen: Sie verarbeiten jeweils nur zwei Tabellen auf einmal. Ein SQL-Join mit mehreren Tabellen wird schrittweise ausgeführt: Zuerst werden zwei Tabellen zusammengefügt, dann das Zwischenergebnis mit der nächsten. Und so weiter.
Obwohl die Reihenfolge der einzelnen Join-Operationen dabei keinen Einfluss auf das Endergebnis hat, wirkt sie sich dennoch auf die Performance aus. Der Optimizer bewertet daher alle Varianten mit einem Cost-Wert und wählt letztendlich die beste Reihenfolge aus. Das bedeutet aber, dass das Optimieren einer komplexen Abfrage selbst zum Performance-Problem werden kann. Je mehr Join-Operationen vorkommen, desto mehr Ausführungsplan-Varianten muss der Optimizer bewerten – mathematisch ausgedrückt: n! (Fakultät). Wenn man Bind-Parameter verwendet, ist das allerdings kein Problem.
Wichtig
Je komplexer eine SQL-Anweisung wird, desto wichtiger sind Bind-Parameter.
Keine Bind-Parameter zu verwenden, ist, als würde man ein Programm jedes Mal neu kompilieren.