In diesem Artikel sehen wir uns an, wie ein Index die Abfrageleistung verbessern kann.
Einführung
Indizes in Oracle und anderen Datenbanken sind Objekte, die Verweise auf Daten in anderen Tabellen speichern. Sie werden verwendet, um die Abfrageleistung zu verbessern, meistens die SELECT-Anweisung.
Sie sind keine „Wunderwaffe“ – sie lösen Performance-Probleme nicht immer mit SELECT-Anweisungen. Sie können jedoch sicherlich helfen.
Betrachten wir dies an einem bestimmten Beispiel.
Beispiel
Für dieses Beispiel verwenden wir eine einzelne Tabelle namens „Kunde“, die Spalten wie „ID“, „Vorname“, „Nachname“, „maximaler Kreditwert“, „Erstellungsdatum“ und andere Spalten enthält, die wir nicht verwenden werden.
SELECT customer_id,first_name,last_name, max_credit, created_date FROM customer;
Hier ist ein Beispiel der Tabelle.
[Tabellen-ID=38 /]
Jetzt werden wir Folgendes finden:
- Wer der Kunden wurde am selben Datum wie die ersten Kunden in die Tabelle aufgenommen
- Kunden nach Nachname in aufsteigender Reihenfolge gefiltert
- Kunden-ID, Vorname, Nachname, maximales Guthaben und Erstellungsdatum anzeigen
Erstellen Sie dazu die folgende Abfrage:
SELECT customer_id, first_name, last_name, max_credit, created_date FROM customer WHERE created_date = ( SELECT MIN(created_date) FROM customer ) ORDER BY last_name;
Die Ausgabe sieht so aus:
[Tabellen-ID=39 /]
Es zeigt die gewünschten Daten.
Performance vor Anwendung des Index
Sehen wir uns nun den EXPLAIN-Plan für diese Abfrage an. Ich habe dies erhalten, indem ich EXPLAIN PLAN FOR für die SELECT-Anweisung und den folgenden Befehl ausgeführt habe:
SELECT * FROM TABLE(dbms_xplan.display);
Sie können ein ähnliches Ausgabeergebnis auch mit der Funktion Explain Plan in Ihrer IDE erhalten.
Wir können sehen, dass es an zwei Stellen einen vollständigen Tabellenzugriff durchführt, nämlich in der Unterabfrage und in der äußeren Abfrage. Dies liegt daran, dass es keine zu verwendenden Indizes für die Tabelle gibt.
Es kostet 2934. Als ich es ausführte, holte die Abfrage 785 Zeilen in 1,9 Sekunden. Es mag schnell erscheinen, aber dies ist nur ein Beispiel, das wir verbessern können. Abfragen in realen Systemen können viel länger dauern.
Eine Möglichkeit, die Leistung dieser Abfrage zu verbessern, besteht darin, der Spalte „created_date“ einen Index hinzuzufügen. Diese Spalte wird sowohl in der WHERE-Klausel der äußeren Abfrage als auch in der MIN-Funktion der inneren Abfrage verwendet.
Index hinzufügen
Wir können dieser Tabelle einen Index hinzufügen, um die Abfrageleistung zu verbessern. Dieser Index wird in der Spalte created_date gespeichert, sodass der Code wie folgt aussehen kann:
CREATE INDEX idx_cust_cdate ON customer (created_date);
Jetzt wird der Index nur für diese Spalte erstellt. Es sollte uns eine Leistungsverbesserung in unserer Abfrage bringen, aber wir müssen es zuerst überprüfen.
Wir haben einen B-Tree-Index erstellt, der wahrscheinlich alles ist, was wir für diese Spalte benötigen. Wir werden es in Kürze im Erklärungsplan bestätigen. Ich habe einen Leitfaden zu Oracle-Indizes geschrieben, der enthält, wie Sie wissen, welcher Indextyp verwendet werden soll, sowie viele andere wertvolle Informationen.
Leistung nach IndexHinzugefügt
Lassen Sie uns den EXPLAIN-Plan für diese Abfrage erneut ausführen.
Wir können sehen, dass im letzten Schritt ein Index verwendet wurde. Es zeigt, dass ein vollständiger Scan mit dem Index idx_cust_cdate ausgeführt wurde, den wir gerade erstellt haben.
Es zeigt auch Gesamtkosten von 1472 und ruft die 785 Datensätze in 0,9 Sekunden ab.
Die Laufzeit hat sich nur leicht verbessert (von 1,9 auf 0,9 Sekunden), aber das ist eine Verbesserung von etwa 50 %, wenn man nur den Index zu diesem kleinen Datensatz hinzufügt.
Wie bereits erwähnt, sind echte Abfragen komplizierter als diese und die Ausführung dauert länger. Dies ist jedoch ein Beispiel dafür, wie ein Index den Abfrageplan und die Abfragelaufzeit verbessern kann.