Richtlinien zur Analyse von EXPLAIN-Informationen
Der primäre Zweck der EXPLAIN-Informationen ist die Analyse von Zugriffspfaden für Abfrageanweisungen. Die Analyse der EXPLAIN-Daten kann Ihnen auf verschiedene Weise helfen, Ihre Abfragen und Ihre Umgebung zu optimieren.
- Verwendung von IndizesDie geeigneten Indizes können die Leistung erheblich fördern. Anhand von EXPLAIN-Ausgaben können Sie ermitteln, ob die von Ihnen für eine bestimmte Gruppe von Abfragen erstellten Indizes tatsächlich verwendet werden. Prüfen Sie die folgende Bereiche auf die Verwendung von Indizes:
- Joinvergleichselemente
- Lokale Vergleichselemente
- Klausel GROUP BY
- Klausel ORDER BY
- Klausel WHERE XMLEXISTS
- SELECT-Liste
Sie können die EXPLAIN-Funktion auch verwenden, um zu ermitteln, ob ein anderer Index oder gar kein Index besser wäre. Führen Sie nach der Erstellung eines neuen Index den Befehl RUNSTATS aus, um Statistikdaten für diesen Index zu erfassen, und kompilieren Sie anschließend die Abfrage erneut. Mit der Zeit stellen Sie (anhand von EXPLAIN-Daten) vielleicht fest, dass eine Tabellensuche anstelle einer Indexsuche verwendet wird. Dies kann sich aus einer Änderung in der Clusterbildung der Tabellendaten ergeben. Wenn der zuvor verwendete Index nun ein niedriges Clusterverhältnis aufweist, sollten Sie folgende Maßnahmen in Erwägung ziehen:- Reorganisieren der Tabelle, um die Daten diesem Index entsprechend in Clustern anzuordnen
- Ausführen des Befehls RUNSTATS zur Erfassung von Statistikdaten für Index und Tabelle
- Erneutes Kompilieren der Abfrage
- ZugriffstypAnalysieren Sie die EXPLAIN-Ausgabe und suchen Sie nach Datenzugriffstypen, die für den Typ von Anwendung, die Sie ausführen, normalerweise nicht optimal sind. Beispiel:
- OLTP-Abfragen (Onlinetransaktionsverarbeitung)
OLTP-Anwendungen bieten sich in der Regel für Indexsuchen mit bereichsbegrenzenden Vergleichselementen an, weil sie meist nur wenige Zeilen zurückgeben, die durch ein Gleichheitsvergleichselement für eine Schlüsselspalte ermittelt werden. Wenn Ihre OLTP-Abfragen eine Tabellensuche verwenden, können Sie die EXPLAIN-Daten analysieren, um herauszufinden, warum keine Indexsuche verwendet wird.
- Reine Suchabfragen
Die Suchbedingungen für eine
reine Suchabfrage
können sehr vage sein, was bewirkt, dass eine große Menge von Zeilen den Bedingungen entspricht. Wenn sich Benutzer normalerweise nur einige Anzeigeseiten von Ausgabedaten ansehen, können Sie dafür sorgen, dass nicht die gesamte Antwortmenge berechnet werden muss, bevor einige Ergebnisse zurückgegeben werden. In diesem Fall unterscheiden sich die Ziele des Benutzers vom grundlegenden Arbeitsprinzip des Optimierungsprogramms, das versucht, den Ressourcenbedarf für die gesamte Abfrage und nicht nur für die ersten wenigen Datenanzeigen zu minimieren.Wenn zum Beispiel die EXPLAIN-Ausgabe zeigt, dass Operatoren sowohl für Mischjoins als auch für Sortierungen im Zugriffsplan verwendet wurden, wird die gesamte Antwortmenge in einer temporären Tabelle gespeichert, bevor Zeilen an die Anwendung zurückgegeben werden. In diesem Fall können Sie versuchen, den Zugriffsplan durch die Verwendung der Klausel OPTIMIZE FOR in der SELECT-Anweisung zu ändern. Wenn Sie diese Option angeben, kann das Optimierungsprogramm versuchen, einen Zugriffsplan auszuwählen, der nicht die gesamte Antwortmenge in einer temporären Tabelle erstellt, bevor die ersten Zeilen an die Anwendung zurückgegeben werden.
- OLTP-Abfragen (Onlinetransaktionsverarbeitung)
- Joinmethoden
Wenn bei einer Abfrage zwei Tabellen verknüpft werden, sollten Sie die Art der verwendeten Joinverarbeitung überprüfen. Joins mit vielen Zeilen, wie sie zum Beispiel bei Abfragen auf Entscheidungshilfedaten auftreten, werden in der Regel durch einen Hash-Join schneller als durch einen Mischjoin ausgeführt. Joins, die nur wenige Zeilen betreffen, wie zum Beispiel Joins in OLTP-Abfragen, sind zumeist als Joins mit Verschachtelungsschleifen schneller. In beiden Fällen kann es jedoch auch Umstände geben, wie beispielsweise die Verwendung lokaler Vergleichselemente oder Indizes, die die Arbeitsweise dieser typischen Joins möglicherweise ändern.