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.
Dieses Thema ist zu groß, um es in einer solchen Frage zu beantworten. Nehmen Sie sich etwas Zeit, um das Oracle-Handbuch zur Leistungsoptimierung zu lesen
quelle
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.
quelle
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.
quelle
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 :)
quelle
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.
quelle
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.
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.
quelle
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.
quelle
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
quelle
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 :
quelle
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.
quelle