Wie interpretieren Sie den Erklärungsplan einer Abfrage?


88

Wenn Sie versuchen zu verstehen, wie eine SQL-Anweisung ausgeführt wird, wird manchmal empfohlen, den EXPLAIN-Plan zu lesen. Welchen Prozess sollte man durchlaufen, um einen Erklärungsplan zu interpretieren (sinnvoll zu machen)? Was sollte auffallen als: "Oh, das funktioniert großartig?" versus "Oh nein, das ist nicht richtig."

Antworten:


80

Ich schaudere, wenn ich Kommentare sehe, dass vollständige Tabellenscans schlecht und der Indexzugriff gut sind. Vollständige Tabellenscans, Indexbereichsscans, schnelle vollständige Indexscans, verschachtelte Schleifen, Zusammenführungsverknüpfungen, Hashverknüpfungen usw. sind einfach Zugriffsmechanismen, die vom Analysten verstanden und mit der Kenntnis der Datenbankstruktur und dem Zweck einer Abfrage in kombiniert werden müssen um zu einer sinnvollen Schlussfolgerung zu gelangen.

Ein vollständiger Scan ist einfach die effizienteste Methode zum Lesen eines großen Teils der Blöcke eines Datensegments (einer Tabelle oder einer Tabellen- (Unter-) Partition), und obwohl dies häufig auf ein Leistungsproblem hinweisen kann, liegt dies nur im Kontext ob es sich um einen effizienten Mechanismus zur Erreichung der Ziele der Abfrage handelt. Als Data Warehouse- und BI-Mitarbeiter ist mein Warnflag Nummer eins für die Leistung eine indexbasierte Zugriffsmethode und eine verschachtelte Schleife.

Für den Mechanismus zum Lesen eines Erklärungsplans ist die Oracle-Dokumentation eine gute Anleitung: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/ex_plan.htm#PFGRF009

Lesen Sie auch das Handbuch zur Leistungsoptimierung durch.

Haben Sie auch ein Google für "Kardinalitäts-Feedback", eine Technik, bei der ein Erklärungsplan verwendet werden kann, um die Schätzungen der Kardinalität in verschiedenen Phasen einer Abfrage mit den tatsächlichen Kardinalitäten zu vergleichen, die während der Ausführung auftreten. Ich glaube, Wolfgang Breitling ist der Autor der Methode.

Fazit: Verstehen Sie die Zugriffsmechanismen. Verstehe die Datenbank. Verstehen Sie die Absicht der Abfrage. Faustregeln vermeiden.


5
Ich wusste, dass du es nach den ersten 9 Wörtern warst. Es ist wie "Name That Tune" ... Ich kann einen Dave A-Beitrag in n Worten oder weniger identifizieren ...

Ich würde ein wenig mit Ihrer Verwendung von "groß" streiten ... manchmal können die Daten so schlecht um Ihre Indexspalten gruppiert sein, dass ein FTS einen Index-Scan für sogar 10% der Zeilen ausführt ...

1
Auf die 10% - absolut. Wenn Sie 200 Zeilen pro Block haben und nach 0,5% der Zeilen suchen, müssen Sie theoretisch möglicherweise auf 100% der Blöcke zugreifen, um alle Werte zu erhalten, sodass es noch extremer als 10% wird.
David Aldridge


5

Die beiden folgenden Beispiele zeigen einen FULL-Scan und einen FAST-Scan unter Verwendung eines INDEX.

Konzentrieren Sie sich am besten auf Ihre Kosten und Kardinalität. In den Beispielen reduziert die Verwendung des Index die Kosten für die Ausführung der Abfrage.

Es ist etwas komplizierter (und ich habe kein 100% iges Handle), aber im Grunde sind die Kosten eine Funktion der CPU- und E / A-Kosten, und die Kardinalität ist die Anzahl der Zeilen, die Oracle zum Parsen erwartet. Beides zu reduzieren ist eine gute Sache.

Vergessen Sie nicht, dass die Kosten einer Abfrage von Ihrer Abfrage und dem Oracle-Optimierungsmodell (z. B. KOSTEN, AUSWÄHLEN usw.) beeinflusst werden können und wie oft Sie Ihre Statistiken ausführen.

Beispiel 1:

SCAN http://docs.google.com/a/shanghainetwork.org/File?id=dd8xj6nh_7fj3cr8dx_b

Beispiel 2 unter Verwendung von Indizes:

INDEX http://docs.google.com/a/fukuoka-now.com/File?id=dd8xj6nh_9fhsqvxcp_b

Und wie bereits vorgeschlagen, achten Sie auf TABLE SCAN. Sie können diese generell vermeiden.


Äh, der Regelmodus hat keine Kosten ... Ich denke, Ihre Aussage ist auf absolut absolute Weise korrekt, aber ich würde sagen, dass sie grundsätzlich ungenau ist. Wenn Sie WÄHLEN sagen, könnten Sie das RBO oder CBO bekommen. CBO ist der einzige, der Kosten berechnet.

4

Das Suchen nach Dingen wie sequentiellen Scans kann etwas nützlich sein, aber die Realität liegt in den Zahlen ... außer wenn die Zahlen nur Schätzungen sind! Was normalerweise weitaus nützlicher ist als das Betrachten eines Abfrageplans , ist das Betrachten der tatsächlichen Ausführung . In Postgres ist dies der Unterschied zwischen EXPLAIN und EXPLAIN ANALYZE. EXPLAIN ANALYZE führt die Abfrage tatsächlich aus und erhält für jeden Knoten echte Zeitinformationen. Das können Sie sehen , was tatsächlich geschieht, statt dessen , was der Planer denkt passieren wird. Oft werden Sie feststellen, dass ein sequentieller Scan überhaupt kein Problem darstellt, sondern etwas anderes in der Abfrage.

Der andere Schlüssel ist die Identifizierung des tatsächlich teuren Schritts. Viele grafische Werkzeuge verwenden Pfeile unterschiedlicher Größe, um anzugeben, wie viel verschiedene Teile des Plans kosten. Suchen Sie in diesem Fall nur nach Schritten, bei denen dünne Pfeile eingehen und ein dicker Pfeil austritt. Wenn Sie keine grafische Benutzeroberfläche verwenden, müssen Sie die Zahlen genau betrachten und herausfinden, wo sie plötzlich viel größer werden. Mit ein wenig Übung wird es ziemlich einfach, die Problembereiche herauszusuchen.


3

Für solche Probleme ist ASKTOM das Beste . Insbesondere enthält seine Antwort auf diese Frage Links zum Online-Oracle-Dokument, in dem viele dieser Regeln erläutert werden.

Eine Sache, die Sie beachten sollten, ist, dass Erklärungspläne wirklich die besten Vermutungen sind.

Es wäre eine gute Idee, den Umgang mit sqlplus zu lernen und mit dem Befehl AUTOTRACE zu experimentieren. Mit einigen harten Zahlen können Sie im Allgemeinen bessere Entscheidungen treffen.

Aber du solltest ASKTOM. Er weiß alles darüber :)


2

Die Ausgabe der EXPLAIN zeigt an, wie lange jeder Schritt gedauert hat. Das erste ist, die Schritte zu finden, die lange gedauert haben, und zu verstehen, was sie bedeuten. Dinge wie ein sequentieller Scan zeigen Ihnen, dass Sie bessere Indizes benötigen - es geht hauptsächlich um die Untersuchung Ihrer speziellen Datenbank und Erfahrung.


2

Ein "Oh nein, das ist nicht richtig" ist oft in Form eines Tabellenscans . Tabellenscans verwenden keine speziellen Indizes und können dazu beitragen, alle in Speicher-Caches nützlichen Elemente zu löschen. In postgreSQL zum Beispiel werden Sie feststellen, dass es so aussieht.

Seq Scan on my_table  (cost=0.00..15558.92 rows=620092 width=78)

Manchmal sind Tabellenscans ideal, wenn beispielsweise ein Index zum Abfragen der Zeilen verwendet wird. Dies ist jedoch eines der Muster der roten Fahne, nach denen Sie zu suchen scheinen.


2
(Vollständige) Tabellenscans löschen nicht unbedingt den Speichercache.
a_horse_with_no_name

2

Grundsätzlich werfen Sie einen Blick auf jede Operation und prüfen, ob die Operationen "sinnvoll" sind, wenn Sie wissen, wie sie funktionieren sollten.

Wenn Sie beispielsweise zwei Tabellen, A und B, in ihren jeweiligen Spalten C und D (AC = BD) verbinden und Ihr Plan einen Clustered-Index-Scan (SQL Server-Begriff - nicht sicher, ob der Oracle-Begriff vorhanden ist) in der Tabelle anzeigt A, dann eine verschachtelte Schleife, die mit einer Reihe von Clustered-Index-Suchvorgängen in Tabelle B verknüpft ist. Möglicherweise liegt ein Problem vor. In diesem Szenario können Sie erwarten, dass die Engine zwei Index-Scans (über die Indizes in den verbundenen Spalten) durchführt, gefolgt von einem Zusammenführungs-Join. Weitere Untersuchungen könnten schlechte Statistiken ergeben, die den Optimierer veranlassen, dieses Verknüpfungsmuster oder einen Index auszuwählen, der tatsächlich nicht vorhanden ist.


1

Sehen Sie sich den prozentualen Zeitaufwand in den einzelnen Unterabschnitten des Plans an und überlegen Sie, was der Motor tut. Wenn beispielsweise eine Tabelle gescannt wird, sollten Sie einen Index für die Felder erstellen, nach denen gescannt wird


1

Ich suche hauptsächlich nach Index- oder Tabellenscans. Dies sagt mir normalerweise, dass mir ein Index für eine wichtige Spalte fehlt, die sich in der where-Anweisung oder der join-Anweisung befindet.

Von http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx :

Wenn in einem Ausführungsplan eines der folgenden Elemente angezeigt wird, sollten Sie diese als Warnzeichen betrachten und auf potenzielle Leistungsprobleme untersuchen. Jeder von ihnen ist aus Sicht der Leistung weniger als ideal.

* Index or table scans: May indicate a need for better or  additional indexes.
* Bookmark Lookups: Consider changing the current clustered index,
  consider using a covering index, limit
  the number of columns in the SELECT
  statement.
* Filter: Remove any functions in the WHERE clause, don't include wiews
  in your Transact-SQL code, may need
  additional indexes.
* Sort: Does the data really need to be sorted? Can an index be used to
  avoid sorting? Can sorting be done at
  the client more efficiently? 

Es ist nicht immer möglich, diese zu vermeiden, aber je mehr Sie sie vermeiden können, desto schneller ist die Abfrageleistung.


1
Tabellenscans sind nicht alle schlecht - Abhängig von der Anzahl der von der Tabelle zurückgegebenen / verarbeiteten Datensätze kann ein vollständiger Tabellenscan schneller sein als ein Indexscan (wenn Sie die Datensätze trotzdem zurückbringen möchten, führen Sie einen Indexscan durch und ein vollständiger Lesevorgang aus der Tabelle - 2 Schritte statt 1).
ScottCher

-7

Faustregeln

(Sie möchten wahrscheinlich auch die Details nachlesen:

Schlecht

Tabellenscans mehrerer großer Tabellen

Gut

Verwenden eines eindeutigen Index Der
Index enthält alle erforderlichen Felder

Häufigster Gewinn

Bei etwa 90% der Leistungsprobleme, die ich gesehen habe, besteht der einfachste Gewinn darin, eine Abfrage mit vielen (4 oder mehr) Tabellen in zwei kleinere Abfragen und eine temporäre Tabelle aufzuteilen.


2
Tischscans werden zu oft als schlechte Dinge angesehen und es ist zunächst das, worauf sich unerfahrene Leute konzentrieren würden. Dies hängt stark von der Anzahl der Datensätze ab, die von dieser Tabelle zurückgegeben werden. Es gibt einen Schwellenwert, wenn es schneller ist, einen vollständigen Tabellenscan durchzuführen als eine Indexsuche.
ScottCher

8
Für den empörenden Rat abgelehnt. 90% der Leistungsprobleme werden NICHT durch temporäre Tabellen und das Aufteilen einer Abfrage gelöst. In welcher Welt lebst du?!
TheSoftwareJedi

@Jedi, ich lebe in einer Welt, in der Unabhängigkeiten größtenteils richtig sind und Datenbanken ziemlich vernünftig strukturiert sind. Es würde mich jedoch interessieren, Ihre Antwort zu lesen.
AJ.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.