SQL: Datenbankabfragen beschleunigen

Was ist schneller: Inner Join, Where oder Liste?

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
In älteren Datenbankmanagementsystemen war nicht immer ein Inner Join möglich, sondern nur die Formulierung über eine Where-Klausel. Das ist manchmal sogar noch heute sinnvoll.

Transkript

Die typische Abfrage heutzutage, die mehrere Tabellen miteinander verbindet, benutzt einen JOIN. In diesem Fall einen Inner-Join, wenn Sie sich das einmal in der grafischen Version gucken wollen. Das ist diese Verbindungslinie zwischen einem Primär-Schlüssel un dem Fremd-Schlüssel. Damit ist ganz klar, wie diese Daten zusammenhängen. Es werden nur diejenigen angezeigt, die hier und dort die gleichen Inhalte haben. Das war nicht immer so. In der Anfangszeit der SQL-Datenbanken konnten nicht alle einen Inner-Join. Deswegen gibt es eine zweite Variante, die das gleiche mit einer WHERE-Klausel löst. Also in der grafischen Version eine etwas ungewohnte Ansicht. Das sieht so ein bisschen wie ein Kreuzprodukt aus. Zwei Tabellen, die nicht miteinander verbunden sind. Aber tatsächlich steht die Verbindung hier unten. Relativ unauffällig. Die viele ID auf dieser Seite muss identisch mit der untervieleIDRef auf jener Seite sein. Nun könnten man sagen, das ist heute egal. Wenn Ihre Datenbank Inner-Join kann, sieht das ja hübscher aus. Aber diese Technik brauchen Sie z. B., wenn Sie Tabellen kriegen, wo jemand schlampig weise die falschen Datentypen benutzt hat. Das habe ich immer wieder. Fertige Tabellen - da hat jemand die Zahlen oder die Datumswerte in ein Textfeld eingetragen. Und wenn Sie das mit einer anderen Tabelle vergleichen wollen, in der korrekterweise ein Datums-Typ oder ein LONG-Zahlentyp steht, dann geht das nicht über Inner-Join. Dann müssen Sie tatsächlich diese WHERE-Version benutzen und dort gegebenenfalls die Felder noch schnell umrechnen in den richtigen Daten-Type. Das geht hier nämlich. Also die Alternative zu einem JOIN ist dieses WHERE. Und es gibt noch eine dritte Variante. Auch die zeige ich Ihnen einmal in der grafischen Version. Da steht bei den Datenquellen gar nicht die zweite Tabelle. Sondern die ist hier in einer Unterabfrage, versteckt will ich jetzt nicht sagen, aber ungewohnt weit weg. Diese Version ist z. B. nötig, wenn Sie Lösch-Abfragen schreiben. Da darf nur die Datenquelle hier oben stehen, die auch gelöscht werden soll, oder in der gelöscht werden soll. Und die zweite Datenquelle muss hier in diesem InListe, bzw. InSelect-Liste erscheinen. Es könnte ja sein, dass das einen Geschwindigkeitsvorteil bringt. Insofern möchte ich das auch für normale Abfragen, wo nicht gelöscht werden soll, prüfen. Wir haben also drei Varianten. Ein Unter-Select in dieser InListe, ein JOIN mit einem WHERE und ein richtiges Inner-Join. Vergleichen wir zuerst die beiden Inner-Joins und WHERE-Verbindung. Der Inner-Join braucht 297 ms. Und das WHERE fast das gleiche. Es ist geringfügig schneller. Wir haben also insgesamt nur 90 % der Laufzeit. Das ist so im Rahmen dessen, was ich noch als nicht wirklich messbar bezeichnen würde. Die gute Nachricht an der Stelle heißt aber, wenn Sie wirklich einmal gezwungen sind, wegen widersprechender oder abweichender Datentypen, das alte WHERE zu benutzen, dann ist das gar kein Nachteil. Im Gegenteil. Vielleicht ist es sogar geringfügig schneller. Im Vergleich mit dem Inner-Join und der Unterabfrage mit dieser Liste, haben Sie allerdings einen deutlichen Zeitverlust. Das Inner-Join ist immer noch in den 297 ms fertig. IN (Liste) braucht 375 ms. Das ist ein Verlust auf insgesamt 126 %. Wenn Sie es allerdings wie bei Lösch-Abfragen, zwingend einsetzen müssen, dann dann bleibt Ihnen sowieso nichts anderes übrig. Aber es ist dann zumindest kein gravierender Verlust. Es ist kein wirklich vielfaches. Und, um das auch einmal zu erwähnen, wenn die Lösch-Abfrage wirklich durchgeführt wird, also nicht nur zu Testzwecken hier nur die Daten angezeigt werden, sondern auch wirklich gelöscht werden, dann muss man ehrlicherweise sagen, dass das Löschen selber, also das physische Entfernen auf dem Datenträger, das dauert so erheblich länger, dass es hier auf diese geringen Zeitverluste nicht ankommt. Aber insgesamt kann man sagen, der Inner-Join und das WHERE sind identisch. Und IN (Liste) ist geringfügig langsamer.

SQL: Datenbankabfragen beschleunigen

Entdecken Sie, wo das Beschleunigungspotenzial für SQL-Datenbanken liegt und lernen Sie die Rezepte für bessere Performance.

2 Std. 15 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
Exklusiv für Abo-Kunden
Erscheinungsdatum:25.03.2015

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!