Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

SQL Grundkurs 1: Die Sprache erlernen

Nutzen eines Index

Testen Sie unsere 2019 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Um ein Gefühl dafür zu bekommen, wann ein Index einen Nutzen bringt, nutzen Sie die Demonstration am Beispiel des MS SQL Servers in diesem Video. Hier sehen Sie anhand der Analyse des Ausführungsplans, wann ein Index beim Ausführen einer Anweisung verwendet werden kann.

Transkript

Ich möchte Ihnen in diesem Video etwas veranschaulichen, wie die Indexverwendung in einer Datenbank funktioniert. Prinzipiell ist es ja so, dass wir einem System nur einen Index zur Verfügung stellen. Ob das System diesen dann auch verwendet oder nicht, entscheidet es selber. Betrachten wir uns ein wenig, wie Einflussgrößen dafür aussehen können. Ich möchte Ihnen das ganz kurz am Beispiel des Microsoft SQL Servers demonstrieren. Dafür erzeuge ich mir eine Produkte-Tabelle, die einen Auszug aus der Artikel-Tabelle enthält. Wir sehen, ich habe nun etwa 1111 Datensätze in diese Tabelle hineinkopiert. Vorerst erzeuge ich die Indizes noch nicht, ich habe die zwei Anweisungen dazu vorbereitet. Betrachten wir nun, wie eine Suche mit oder ohne Index von sich geht. Dafür verwende ich eine einfache Anweisung "SELECT * FROM wawi.produkte WHERE artnr =" und ich nehme wahllos eine Artikelnummer, z.B. 1544. Im Moment gibt es noch keinen Index für diese Tabelle, d.h. der Server hat gar nicht die Wahl, es wird ein sogenannter Full-Table-Scan bei dieser Suche ausgeführt. Ich führe einmal die Anweisung aus, und wir sehen, es gibt einen Treffer. Wir können uns jetzt den sogenannten Ausführungsplan, den "Execution Plan", hier anzeigen lassen, dafür klicke ich dieses Symbol hier oben. Wir sehen, dass hier ein Table-Scan gemacht wird, um das Ergebnis zu eruieren. Da es noch keinen Index gibt, hat das System gar keine andere Wahl. Nun erzeuge ich einen Index für die Artikelnummer. Nachdem ich diesen Index erzeugte habe, sehen wir, das Ergebnis natürlich ist noch immer dasselbe. Betrachten wir uns den nun generierten Ausführungsplan. Und wir sehen, dass sich hier etwas geändert hat. Wie ist dieser Plan zu interpretieren? Wir sehen hier "Index Seek" stehen, das bedeutet, dass ein Index gesucht worden ist. "RID Lookup" Row ID Lookup hier im unteren Teil bedeutet, dass das System zur im Index gefundenen Artikelnummer aus den Tabellendaten selber den Rest dazu holt, weil wir ja "SELECT*" verwendet haben, und deshalb nicht nur die Artikelnummer angezeigt bekommen möchten, sondern alle Daten Wenn ich jetzt meine SELECT-Klausel so modifiziere, dass ich anstelle des Sterns nur die Artikelnummer verwende, dann ändert sich der Ausführungsplan dahingehend dass nur mehr der Index Seek überbleibt, da das Ergebnis direkt aus dem Index geliefert wird, weil ja keine weiteren Informationen hier dazugeholt werden müssen aus der Tabelle. Wo ist nun die Grenze der Indexverwendung bezogen auf die zu erwartende Trefferanzahl? Das System verwendet einen Index ja nur dann, wenn die erwartete Trefferanzahl zu gering ist. Denn wenn eine große Trefferanzahl erwartet wird, ist die Suche im Index oder über den Index und das dazulinken sozusagen der gefundenen Restdaten für das System aufwendiger als ein Table-Scan. Versuchen wir zu eruieren, wo hier die Schmerzgrenze für unser System liegt. Dazu kopiere ich mir diese Anweisung und ändere die WHERE-Klausel leicht ab, indem ich sage "WHERE artnr <= 1010". Mit dieser Anweisung bekommen wir zehn Zeilen zurückgeliefert. Zehn Zeilen von gesamt 1111 Datensätzen, d.h. deutlich oder knapp unter 1 Prozent. Schauen wir uns den Ausführungsplan an. Wir sehen, das System hat zwar sozusagen dankend zur Kenntnis genommen, dass es einen Index gibt, hat ihn aber nicht verwendet. Ich werde jetzt sukzessive die erwartete Trefferanzahl hinunterschrauben, indem ich jetzt sage OK, ich ändere das auf 1008. Und auch hier sehen wir noch keine keine Indexverwendung. Ich gehe jetzt bis auf 1004 zurück, lasse mir noch einmal den Ausführungsplan anzeigen, und nach wie vor hat das System einen Table-Scan präferiert. Nun senke ich die Menge noch einmal herab auf 3, das heißt, ich würde jetzt mit dieser Anweisung exakt drei Treffer bekommen. Und jetzt haben wir den Punkt erreicht, wo das System die Indexverwendung durchführt. Sie sehen also, dass die Grenze für die Indexverwendung, was die erwartete Trefferanzahl anbelangt, wahrscheinlich deutlich unter dem liegt, was Sie geschätzt hätten. Sehen wir uns nun an, was uns ein zusammengesetzter Index bringen kann. Dazu erzeuge ich jetzt den zweiten Index, der die Spalten "bezeichnung", "gruppe" und "vkpreis" enthält. Nun erzeuge ich ein SQL-Statement, mit dem ich auf die "bezeichnung" filtere. "WHERE bezeichnung LIKE" und ich suche mir alle Artikel, die in der Bezeichnung mit "gardena%" beginnen. Schauen wir uns an, wie viele Treffer dies bedeutet, das bedeutet 21 Zeilen. Sehen wir uns den Ausführungsplan an, und nicht schwer zu erraten, das hätten wir auch erwartet dass es hier einen Table-Scan gibt. Theoretisch kann ja dieser Index verwendet werden. Warum? Weil die Spalte "bezeichnung" eine führende Kopfspalte des zusammengesetzten Index ist. Das heißt, der Index kann auch verwendet werden, wenn nach "bezeichnung" und "bezeichnung, gruppe" gesucht wird oder natürlich nach allen dreien. Manchmal ist ein zusammengesetzter Index von Vorteil, weil er universeller einsetzbar ist. Natürlich muss ich auch erwähnen, dass im konkreten Fall, wenn ich nach der "bezeichnung" suche, ein Einzelindex für diese Spalte effizienter ist als ein zusammengesetzter Index. Aber man kann dadurch unter Umständen die Anzahl der Indizes reduzieren, wenn man Spalten zusammenfasst. Das muss dann im Einzelfall eben abgewogen werden, welche Vorteile oder Nachteile hier überwiegen. Ich modifiziere jetzt diese Anweisung und ändere meine Bedingung von "gardena%" auf "wecker%". Wenn wir diese Anweisung ausführen, bekommen wir drei Treffer. Wir erinnern uns, bei dieser Anzahl hat er bei der vorigen Variante, bei der Suche über die Artikelnummer, bereits auf den Index zugegriffen. Und wieder schauen wir uns den Ausführungsplan an und wir sehen, jetzt ist der Index verwendet worden. Was geschieht nun, wenn wir diese Anweisung verwenden und leicht modifizieren? Wir haben ja gesehen, dass bei dieser Anweisung das System auf die Verwendung des Index verzichtet. Nun modifiziere ich die SELECT-Klausel, und verwende in der SELECT-Klausel die Spalte "gruppe", "bezeichnung" und "vkpreis". Nach wie vor hat sich natürlich die Anzahl der Treffer von 21 nicht geändert. Aber was ändert sich jetzt hier am geschätzten Ausführungsplan? Wir sehen jetzt, dass es ausschließlich einen Index Seek gibt. Woran liegt das? Ich habe ja hier in der SELECT-Klausel die drei Spalten "gruppe", "bezeichnung" und "vkpreis" verwendet. Alle drei Spalten sind im Index enthalten. Das heißt, das System ist jetzt in der Lage, das komplette Ergebnis ausschließlich aus dem Index zu generieren. Sie sehen auch hier, dass der "Row ID Lookup" hier fehlt. Lediglich der Index Seek wird verwendet, und das Gesamtergebnis so erzeugt. Das ist natürlich sehr schnell. Auch das ist in der Praxis eine Situation, wofür man gerne einen zusammengesetzten Index verwendet, wenn man nämlich Abfragen hat, die nur wenige Spalten verwenden und das häufig, dann kann man diese Spalten im Index zusammenfassen und dieses Phänomen hier, wenn man das so nennen möchte, nutzen. Ich bezeichne das, diese Variante hier, so als wichtigen Turboboost. Damit wird auch bei riesigen Datenmengen die Anweisung extrem performant und schnell. Beachten wir, was passiert, wenn wir bei dieser Anweisung sogar die WHERE-Klausel außen vor lassen. Selbst dann kommt es zu einem Index-Scan, d.h. selbst dann, wenn das gesamte Ergebnis der Tabelle abgerufen wird. Denn auch hier wird das Ergebnis aus dem Index generiert und das ist performanter, als wenn auf die eigentliche Datenstruktur zugegriffen werden muss. Sie haben in diesem Video einen Überblick über einige Aspekte bekommen, die die Verwendung eines Index in einem Datenbankmanagementsystem beeinflussen. Beachten Sie, dass ein Index dann effizient ist, wenn die erwartete Trefferanzahl gering ist. Erwägen Sie, auch zusammengesetzte Indizes zu verwenden, vor allem, wenn Sie nicht alle Spalten einer Tabelle bei allen Abfragen benötigen. Überdenken Sie generell die Verwendung von "SELECT *", denn damit schließen Sie die Verwendung eines zusammengesetzten Index oder überhaupt eines Index, um das Gesamtergebnis zu generieren, generell aus. Deshalb sollten Sie immer nur die Spalten in der SELECT-Klausel verwenden, die Sie unbedingt benötigen, weil vielleicht kommen Sie dann auch einmal in den Genuss eines reinen Index Seek.

SQL Grundkurs 1: Die Sprache erlernen

Arbeiten Sie sich in die Grundlagen der Datenbanksprache SQL am Beispiel von Microsoft SQL Server, Oracle und MySQL ein und lassen Sie sich die praktische Nutzung erklären.

14 Std. 40 min (112 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

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!