Frage

Ich versuche, eine Abfrage zu optimieren, aber nicht ganz einige der Informationen zurück von verstehen Erklären Sie planen . Kann mir jemand die Bedeutung der Optionen und die Kosten Spalten sagen? In der Spalte OPTIONS, sehe ich nur das Wort FULL. In der Spalte Kosten kann ich ableiten, dass eine niedrigere Kosten bedeutet eine schnellere Abfrage. Aber was genau macht den Kostenwert darstellen und was ein akzeptabler Grenzwert?

War es hilfreich?

Lösung

Der Ausgang PLAN von EXPLAIN ist eine Debug-Ausgabe von Oracle Abfrage-Optimierer. Die Kosten ist die letzte Ausgabe der Kostenbasis Optimiser (CBO), deren Zweck es ist, welche der vielen verschiedenen möglichen Pläne wählen sollte die Abfrage auszuführen verwendet werden. Das CBO berechnet ein relativ Kosten für jeden Plan, dann den Plan nehmen mit den niedrigsten Kosten.

(Hinweis: in einigen Fällen die CBO nicht genügend Zeit, um jeden möglichen Plan zu bewerten; in diesen Fällen ist es nimmt nur den Plan mit den niedrigsten Kosten bisher gefunden)

In der Regel einer der größten Mitwirkenden zu einer langsamen Abfrage ist die Anzahl der gelesenen Zeilen, die Abfrage-Service (Blöcke, um genauer zu sein), so dass die Kosten basieren werden in Teil auf die Anzahl der Zeilen die optimiser Schätzungen müssen gelesen werden.

Zum Beispiel kann sagen, dass Sie die folgende Abfrage haben:

SELECT emp_id FROM employees WHERE months_of_service = 6;

(Die months_of_service Spalte eine NOT NULL Bedingung darauf und einem normalen Index auf sie.)

Es gibt zwei grundlegende Pläne der optimiser könnte hier wählen:

  • Planen. 1: Lesen Sie alle Zeilen aus der Tabelle „employees“, für jeden, ob das Prädikat wahr ist (months_of_service=6)
  • Planen. 2: der Index lesen, wo months_of_service=6 (dies führt zu einer Reihe von ROWIDs), dann in die Tabelle auf dem ROWIDs zurück basierten Zugriff

Lassen Sie uns vorstellen, dass die „Mitarbeiter“ -Tabelle 1.000.000 (eine Million) Zeilen. Lassen Sie uns weiter vorstellen, dass die Werte für months_of_service Bereich von 1 bis 12 und sind ziemlich gleichmäßig aus irgendeinem Grund verteilt.

Die Kosten von Plan 1 , die einen Scan beinhaltet, werden die Kosten alle Zeilen in der Tabelle Personal zu lesen, die in etwa gleich 1.000.000 ist; aber da Oracle wird oft in der Lage sein, die Blöcke mit Multi-Block zu lesen, lesen, werden die tatsächlich Kosten niedriger sein (je nachdem, wie Sie Ihre Datenbank eingerichtet ist) - z.B. Lassen Sie uns vorstellen, ist die Multi-Block-Lesezählung 10 - die berechneten Kosten für den Scan 1.000.000 / 10 sein wird; Overal Kosten = 100.000.

Die Kosten von Plan 2 , die eine INDEX RANGE SCAN und eine Tabellensuche durch ROWID beinhaltet, werden die Kosten den Index des Abtastens, zuzüglich der Kosten für die Tabelle für den Zugriff von ROWID. Ich werde nicht gehen, wie sich Indexbereich Scans kalkulierten, aber lassen Sie uns vorstellen, die Kosten für den Scan-Indexbereich ist 1 pro Zeile; wir erwarten, dass eine Übereinstimmung in 1 von 12 Fällen zu finden, so dass die Kosten des Index-Scan beträgt 1.000.000 / 12 = 83.333; zuzüglich der Kosten in der Tabelle für den Zugriff auf (1 Block pro Lesezugriff übernehmen, können wir nicht verwenden Multi-Block liest hier) = 83.333; Gesamtkosten = 166.666.

Wie Sie sehen können, werden die Kosten von Plan 1 (Scan) ist weniger als die Kosten von Plan 2 (Index-Scan + Zugang von Rowid.) - was bedeutet das CBO den vollständigen Scan wählen würde

Wenn die Annahmen hier vom Optimiser gemacht wahr sind, dann in der Tat Plan 1 wird bevorzugt und wesentlich effizienter als Plan 2 -., Die den Mythos widerlegt, dass die vollständige Scans ist „immer schlecht“

Die Ergebnisse würden ganz anders sein, wenn das optimiser Ziel FIRST_ROWS (n) anstelle von ALL_ROWS - in diesem Fall der Optimiser-Plan begünstigen würde 2, weil es oft die ersten Zeilen schneller zurückkehren wird, auf Kosten der weniger effizient für die gesamte Abfrage.

Andere Tipps

Der CBO baut einen Entscheidungsbaum, die Kosten für jeden möglichen Ausführungspfad verfügbar pro Abfrage zu schätzen. Die Kosten werden durch die CPU_cost oder I / O_cost Parametersatz auf der Instanz festgelegt. Und das CBO schätzt die Kosten, wie gut es kann mit den Statistiken der Tabellen und Indizes, die die Abfrage verwendet wird. Sie sollten stimmen Sie Ihre Abfrage nicht allein auf Kosten basiert. Kosten können Sie verstehen, warum der Optimierer tut, was es tut. Ohne Kosten könnten Sie herausfinden, warum der Optimierer den Plan wählte es tat. Niedrigere Kosten bedeutet nicht, eine schnellere Abfrage. Es gibt Fälle, in denen dies der Fall ist, und es wird Fälle geben, wo dies nicht stimmt. Die Kosten werden auf der Grundlage Ihrer Tabelle Statistiken und wenn sie falsch sind die Kosten falsch sein wird.

Wenn Sie Ihre Abfrage Tuning, sollten Sie einen Blick auf die Mächtigkeit nehmen und die Anzahl der Zeilen von jedem Schritt. Haben sie sinnvoll? Ist die Mächtigkeit der Optimierer ist richtig angenommen? Ist die Reihen sind vernünftig zurückzukehren. Wenn die Information vorhanden ist falsch sein dann sehr wahrscheinlich der Optimierer nicht die richtigen Informationen es die richtige Entscheidung treffen muß. Dies könnte aufgrund veralteter oder fehlender Statistiken über die Tabellen und Indizes sowie CPU-Statistiken sein. Seine besten haben Statistiken aktualisiert, wenn eine Abfrage Tuning, das Beste aus dem Optimierungsprogramm zu bekommen. Ihr Schema zu kennen, ist auch eine große Hilfe bei der Abstimmung. Zu wissen, wann der Optimierer eine wirklich schlechte Entscheidung und zeigt sie in dem richtigen Pfad mit einem kleinen Hinweis wählte eine Last von Zeit sparen.

Dies ist ein Hinweis für die Verwendung von PLAN mit Oracle ERKLäREN: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/ex_plan.htm ), mit spezifischen Informationen zu den hier Spalten: 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 einen Voll Table-Scan Ihre Daten zu finden, tut. Das ist in Ordnung, in bestimmten Situationen, sonst ein Indikator für eine schlechte Indizierung / Abfrage Schreiben.

Im Allgemeinen, mit Plänen erklären, möchten Sie Ihre Abfrage, um sicherzustellen, Schlüssel nutzt, so kann Oracle die Daten finden Sie suchen mit der geringsten Anzahl von Zeilen möglich zugreifen. Letzten Endes kann man irgendwann nur so weit mit der Architektur Ihrer Tabellen erhalten. Wenn die Kosten zu hoch bleiben, können Sie über Einstellen des Layout Ihres Schemas denken, um mehr Leistung basieren.

In der letzten Oracle-Versionen, die Kosten stellen die Menge der Zeit, dass der Optimierer die Abfrage zu nehmen erwartet, in Einheiten der Höhe der Zeit ausgedrückt für einen einzelnen Block erforderlich lesen.

Also, wenn ein einzelner Block gelesen 2ms nimmt und die Kosten werden als „250“ ausgedrückt, könnte die Abfrage zu erwarten 500ms dauern.

Der Optimiser berechnet die Kosten auf der Basis der geschätzten Anzahl von einzelnen Block und Multiblock liest, und die CPU-Auslastung des Plans. Letzteres kann durch die Durchführung bestimmter Operationen vor anderen bei der Minimierung der Kosten sehr nützlich sein, eine hohe CPU-Kosten-Operationen, um zu versuchen und zu vermeiden.

Damit stellt sich die Frage, wie der Optimiser weiß, wie lange Operationen nehmen. jüngste Oracle-Versionen erlauben der Sammlung von „Systemstatistiken“, das ist definitiv nicht mit Statistiken über Tabellen oder Indizes zu verwechseln. Die Systemstatistiken sind Messungen der Leistung der Hardware, vor allem wichtig:

  1. Wie lange ein einzelner Block Lese nimmt
  2. Wie lange eine Multiblock-Lese nimmt
  3. Wie groß las ein Multiblock ist (oft unterschiedlich auf den maximal möglichen aufgrund Tabelle Ausmaße kleiner ist als die maximal zu sein, und aus anderen Gründen).
  4. CPU-Leistung

können Diese Zahlen variieren stark je nach Betriebsumgebung des Systems, und verschiedene Sätze von Statistiken können für „Tag OLTP“ Operationen und „Nacht Batch-Reporting“ Operationen und für „Ende des Monats-Berichts“ gespeichert werden, wenn Sie es wünschen .

Diese Sätze von Statistiken, ein bestimmte Abfrageausführungsplan kann für Kosten in unterschiedlichen Betriebsumgebungen bewertet wird Gegeben, die Verwendung von Full-Table-Scans zu bestimmten Zeiten oder Index-Scans bei anderen fördern könnte.

Die Kosten sind nicht perfekt, aber die Optimierers wird bei Selbstüberwachung besser mit jedem Release und können Feedback der tatsächlichen Kosten im Vergleich zu den geschätzten Kosten, um bessere Entscheidungen für die Zukunft zu machen. dies macht es auch etwas schwieriger zu prognostizieren.

Beachten Sie, dass die Kosten nicht notwendigerweise Taktzeit der Wand, als parallele Abfrageoperationen eine Gesamtzeit über mehrere Threads verbrauchen.

In älteren Versionen von Oracle die Kosten der CPU-Operationen ignoriert wurden, und die relativ Kosten für Einzel- und Multiblock liest wurden effektiv fixieren nach init-Parametern.

FULL bezieht sich wahrscheinlich auf einen vollständigen Tabellenscan, was bedeutet, dass keine Indizes verwendet werden. Dieser ist in der Regel darauf hinweist, dass etwas nicht in Ordnung ist, es sei denn, die Abfrage soll alle Zeilen in einer Tabelle verwenden.

Die Kosten sind eine Zahl, die die Summe der verschiedenen Lasten signalisiert, Prozessor, Speicher, Festplatte, IO und hohe Zahlen sind in der Regel schlecht. Die Zahlen werden aufsummiert, wenn an die Wurzel des Plans zu bewegen, und jeder Zweig sollte die Engpässe lokalisieren geprüft werden.

Sie können auch v $ sql und v $ session abfragen Statistiken über SQL-Anweisungen zu erhalten, und dies wird für alle Arten von Ressourcen, Timings und Hinrichtungen detaillierte Metriken haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top