Verstehen der Ergebnisse von Execute Explain Plan in Oracle SQL Developer
Ich versuche, um eine Abfrage zu optimieren, aber verstehe nicht ganz, einige der Informationen, die zurückgegeben werden aus Erklären, Plan. Kann mir jemand sagen die Bedeutung der OPTIONEN und KOSTEN Spalten? In der OPTIONS-Spalte, ich sehe nur das Wort FULL. In die KOSTEN-Spalte, ich kann ableiten, dass eine geringere Kosten bedeuten eine schnellere Abfrage. Aber was genau ist die Kosten Wert darstellen und was ist eine akzeptable Schwelle?
Kommentar zu dem Problem
Sie können durch Grundlegendes zu Datenbank-Indizes um zu verstehen, verschiedene Szenarien der Wahl einen plan.
InformationsquelleAutor der Frage Kevin Babcock | 2009-05-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Ausgabe von EXPLAIN PLAN ist eine debug-Ausgabe aus der Oracle query Optimizer. Die KOSTEN ist die endgültige Ausgabe der Cost-based Optimizer (CBO), von denen der Zweck ist, zu bestimmen, welche der vielen anderen möglichen Pläne sollten verwendet werden, um die Abfrage auszuführen. Die CBO berechnet die relativen Kosten für jeden plan, nimmt dann den plan mit den niedrigsten Kosten.
(Hinweis: in einigen Fällen kann die CBO nicht genug Zeit, um zu bewerten alle möglichen planen; in diesen Fällen ist es nur die picks der plan mit den geringsten Kosten gefunden bisher)
Im Allgemeinen, einer der größten Beitragszahler zu einer langsamen Abfrage ist die Anzahl der Zeilen Lesen, um die Abfrage (Block, um genauer zu sein), so sind die Kosten basieren in Teil auf die Anzahl der Zeilen, die vom Optimierer-Schätzungen werden müssen, gelesen zu werden.
Zum Beispiel, können sagen, Sie haben die folgende Abfrage:
(Die
months_of_service
Spalte eine not NULL-Einschränkung auf Sie und einen normalen index auf.)Gibt es zwei grundlegende Pläne der Optimierer wählen könnte, hier:
months_of_service=6
).months_of_service=6
(dies führt zu einer Reihe von ROWIDs), dann den Zugriff auf die Tabelle anhand der ROWIDs zurückgegeben.Stellen wir uns vor, die Tabelle "employees" hat 1,000,000 (1 million) Zeilen. Lassen Sie uns weiter vorstellen, dass die Werte für months_of_service Bereich von 1 bis 12 und sind relativ gleichmäßig verteilt aus irgendeinem Grund.
Die Kosten der Plan 1, die mit einem VOLLSTÄNDIGEN SCAN werden die Kosten für das Lesen der Zeilen in der Tabelle "employees", welche ungefähr gleich zu 1.000.000; da aber Oracle wird oft in der Lage zu Lesen, die Blöcke mit dem multi-block liest, sind die tatsächlichen Kosten niedriger sein wird (je nachdem, wie Sie Ihre Datenbank eingerichtet ist) - z.B. stellen wir uns vor, die multi-block read-count 10 - die berechneten Kosten von der full-scan von 1.000.000 /10; Overal Kosten = 100.000 Euro.
Die Kosten der Plan 2, die mit einem INDEX RANGE SCAN und table-lookup durch ROWID, werden die Kosten für das Scannen der index, zuzüglich der Kosten für den Zugriff auf die Tabelle ROWID. Ich gehe nicht in wie index range scans werden kalkuliert aber stellen wir uns vor, die Kosten für die index-range-scan ist 1 pro Zeile; wir erwarten, um eine übereinstimmung zu finden in 1 von 12 Fällen, so dass die Kosten des index-scan-1.000.000 /12 = 83,333; plus die Kosten für den Zugriff auf die Tabelle (unter der Annahme 1 block read pro Zugang können wir nicht für die Verwendung von multi-block hier liest) = 83,333; Gesamtkosten = 166,666.
Wie Sie sehen können, die Kosten für Plan 1 (full-scan) ist WENIGER als die Kosten von Plan 2 (index-scan + access by rowid) - was bedeutet das CBO würde, wählen Sie den VOLLSTÄNDIGEN scan.
Wenn die Annahmen, die hier durch den Compiler, die wahr sind, dann in der Tat Plan 1 besser und viel effizienter als Plan 2 - die widerlegt den Mythos, dass die VOLLSTÄNDIGE scans sind "immer schlecht".
Die Ergebnisse wäre ganz anders, wenn der Optimierer Ziel war FIRST_ROWS(n) statt ALL_ROWS - in diesem Fall der Optimierer würde zugunsten Plan 2, da wird es oft geben Sie die ersten paar Zeilen schneller, auf Kosten der weniger effizient für die gesamte Abfrage.
InformationsquelleAutor der Antwort Jeffrey Kemp
Den CBO baut einen Entscheidungsbaum, der Abschätzung der Kosten von jedem möglichen Ausführungspfad verfügbar pro Abfrage. Die Kosten werden durch die CPU_cost oder ich/O_cost parameter festgelegt, die auf die Instanz. Und das CBO schätzt die Kosten, so gut es mit den vorhandenen Statistiken der Tabellen und Indizes, die die Abfrage verwenden. Sie sollten nicht optimieren Sie Ihre Abfrage basiert auf den Kosten allein. Kosten, ermöglicht es Ihnen zu verstehen, WARUM der Optimierer ist zu tun, was es tut. Ohne Kosten, die Sie herausfinden konnte, warum der Optimierer wählte der plan es getan hat. Niedrigere Kosten bedeutet nicht, dass eine schnellere Abfrage. Es gibt Fälle, in denen dies wahr ist, und es wird Fälle geben, wo das ist falsch. Kosten basiert auf den Tisch stats und wenn Sie falsch sind, die Kosten gehen auf falsch sein.
Beim optimieren Sie Ihre Anfrage, sollten Sie einen Blick auf die Kardinalität und die Anzahl der Zeilen in jedem Schritt. Haben Sie Sinn machen? Ist die Kardinalität der Optimierer ist unter der Annahme richtig? Die Zeilen Rückkehr zumutbar ist. Wenn die information falsch ist, dann es sehr wahrscheinlich ist der Optimierer nicht den richtigen Informationen, die es braucht, um die richtige Entscheidung zu treffen. Dies könnte durch veraltete bzw. fehlende Statistiken über die Tabelle und der index sowie der cpu-Statistiken. Seine besten stats aktualisiert, wenn tuning einer Abfrage zu bekommen, die die meisten von die Optimierung. Zu wissen, dein schema ist auch eine große Hilfe beim tuning. Zu wissen, Wann der optimizer wählte eine wirklich schlechte Entscheidung und zeigt Sie in den richtigen Pfad mit einem kleinen Tipp kann sparen Sie eine Last von Zeit.
InformationsquelleAutor der Antwort MichaelN
Hier ist eine Referenz für die Verwendung von EXPLAIN PLAN mit Oracle: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/ex_plan.htm), mit spezifischen Informationen zu den Spalten finden Sie hier: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/ex_plan.htm#i18300
Ihre Erwähnung von "VOLL" zeigt mir, dass die Abfrage ist dabei ein full-table-scan Ihre Daten zu finden. Das ist okay, in bestimmten Situationen, ansonsten ist ein Indikator für mangelhafte Indizierung /Abfrage schreiben.
In der Regel, erklären Pläne, die Sie wollen, um sicherzustellen, dass Ihre Abfrage wird unter Verwendung Schlüssel, so Oracle können finden die Daten, die Sie suchen mit dem Zugriff, der die geringste Anzahl von Reihen möglich. Letztlich kann man irgendwann nur erhalten Sie so weit mit der Architektur Ihrer Tabellen. Wenn die Kosten bleiben zu hoch, können Sie denken über die Anpassung des Layouts an Ihr schema zu mehr Leistung basiert.
InformationsquelleAutor der Antwort drowe
In den letzten Oracle-Versionen die KOSTEN repräsentieren, die Menge der Zeit, dass der Optimierer erwartet, dass die Abfrage zu nehmen, ausgedrückt in Einheiten der Zeit, die erforderlich ist für einen einzelnen block Lesen.
Also, wenn Sie einen einzelnen block Lesen dauert 2ms und Kosten, ausgedrückt als "250", die Abfrage könnte erwartet werden 500 MS abgeschlossen.
Dem Optimierer berechnet die Kosten auf der Grundlage der geschätzten Anzahl von single-block-und multiblock-Lesevorgänge und den CPU-Verbrauch des plans. letzteres kann sehr nützlich sein bei der Minimierung der Kosten, die durch die Durchführung bestimmter Operationen vor den anderen, um zu versuchen und vermeiden Sie hohe CPU-Kosten von Operationen.
Damit stellt sich die Frage, wie der Optimierer weiß, wie lange die Vorgänge dauern. den letzten Oracle-Versionen erlauben es, die Sammlungen von "system-Statistiken", die durchaus nicht zu verwechseln mit Statistiken auf Tabellen oder Indizes. Die system-Statistiken sind Messungen der Leistung der hardware, meist wichtiger ist:
Können diese zahlen variieren stark je nach der Betriebsumgebung des Systems, und verschiedene Sätze von Statistiken, die gespeichert werden können, für die "daytime " OLTP" - Operationen und "nächtlichen batch-reporting" - Operationen, und für "Ende des Monats-reporting", wenn Sie möchten.
Angesichts dieser Sätze von Statistiken, die eine bestimmte Abfrage-Ausführungsplan ausgewertet werden kann für Kosten in unterschiedlichen Betriebssystem-Umgebungen, die möglicherweise fördern, die Verwendung von full-table-scans zu bestimmten Zeiten oder index-scans auf andere.
Den Kosten ist nicht perfekt, aber das Optimierungstool wird besser auf self-monitoring mit jedem release, und kann die Rückmeldung der tatsächlichen Kosten im Vergleich zu den geschätzten Kosten, um bessere Entscheidungen für die Zukunft. dies macht es auch eher schwer vorherzusagen.
Beachten Sie, dass die Kosten nicht unbedingt Wanduhr Zeit, als parallel-query-Operationen verbrauchen Sie eine Zeitspanne über mehrere threads.
In älteren Versionen von Oracle, die Kosten von CPU-Operationen ignoriert wurde, und die relativen Kosten der Einzel-und multiblock-Lesevorgänge wurden effektiv behoben nach init-Parameter.
InformationsquelleAutor der Antwort David Aldridge
VOLL ist, bezieht sich wohl auf ein full table scan, was bedeutet, dass keine Indizes verwendet werden. Dies ist in der Regel darauf hinweist, dass etwas falsch ist, es sei denn, die Abfrage soll alle Zeilen in einer Tabelle.
Kosten ist eine Zahl, die Signale die Summe der einzelnen Lasten, Prozessor, Arbeitsspeicher, disk, IO, und hohe zahlen sind in der Regel schlecht. Die zahlen werden addiert, wenn Sie sich an der Wurzel des plans, und jeder Zweig sollte untersucht werden, suchen Sie die Engpässe.
Können Sie auch wollen, um die Abfrage v$sql und v$session Statistiken über SQL-Anweisungen, und diese müssen detaillierte Metriken für alle Arten von Ressourcen, Zeiten und Ausführungen.
InformationsquelleAutor der Antwort stili