Wie bekommst du den Erklärungsplan?

10

Kann jemand bitte etwas über den Erklärungsplan erklären und wie bekommt man den Erklärungsplan für eine Abfrage? Auch wenn es ein SQL-Skript gibt, das als Dienstprogramm dafür verwendet werden kann, wäre das großartig.

user419534
quelle
1
"Wenn es ein SQL-Skript gibt, das als Dienstprogramm für dieses verwendet werden kann" Welche Art von Dienstprogramm suchen Sie?
Derek Downey
2
Viele SQL-Entwicklungstools verfügen über sehr benutzerfreundliche GUIs, um Ausführungspläne abzurufen. Oracle SQL Developer hat eine. Haben Sie Zugriff auf solche Tools oder möchten Sie dies speziell über Skripte tun?
FrustratedWithFormsDesigner
Ich habe Oracle SQL Developer, möchte aber Skripte kennen.
user419534
2
Wenn Sie einen Kurs mit Jonathan Lewis absolviert haben , wissen Sie, dass es ungefähr 8 verschiedene Möglichkeiten gibt, einen Ausführungsplan aus Oracle herauszuholen. Bitte stimmen Sie diesem Kommentar zu, wenn ich eine Antwort hinzufügen soll, in der alle verschiedenen Methoden aufgeführt sind.
Colin 't Hart

Antworten:

9

Sie können das Paket DBMS_XPLAN verwenden :

SQL> explain plan for select * from dual;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     2 |     2 |
|   1 |  TABLE ACCESS FULL   | DUAL        |     1 |     2 |     2 |
--------------------------------------------------------------------
Note: cpu costing is off
Vincent Malgrat
quelle
5

Die Anweisung EXPLAIN PLAN zeigt Ausführungspläne an, die vom Optimierer für die Anweisungen SELECT, UPDATE, INSERT und DELETE ausgewählt wurden. Ein Anweisungsausführungsplan ist die Folge von Operationen, die die Datenbank ausführt, um die Anweisung auszuführen.

EXPLAIN PLAN FOR ...

Ersetzen Sie das ... durch Ihre SQL-Anweisung. Führen Sie nach dem Ausführen dieses Vorgangs Folgendes aus, um den Plan anzuzeigen:

SELECT * FROM table(dbms_xplan.display);

Weitere Informationen finden Sie in den Abschnitten Übersicht oder Verwendung im Oracle 11g-Handbuch zur Leistungsoptimierung.

Leigh Riffel
quelle
1

Dies ist eine sehr häufige Frage, daher habe ich beschlossen, diese Antwort in einen Artikel umzuwandeln .

Der geschätzte SQL-Ausführungsplan

Der geschätzte Ausführungsplan wird vom Optimierer generiert, ohne die SQL-Abfrage auszuführen. Sie können den geschätzten Ausführungsplan von jedem SQL-Client mit EXPLAIN PLAN FOR generieren oder Oracle SQL Developer für diese Aufgabe verwenden.

Erklären Sie den Plan für

Wenn Sie bei Verwendung von Oracle den EXPLAIN PLAN FORBefehl einer bestimmten SQL-Abfrage voranstellen , speichert die Datenbank den geschätzten Ausführungsplan im folgenden Verzeichnis PLAN_TABLE:

EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Um den geschätzten Ausführungsplan anzuzeigen, müssen Sie ihn verwenden DBMS_XPLAN.DISPLAY, wie im folgenden Beispiel dargestellt:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))

Mit der Formatierungsoption ALL + OUTLINE können Sie mehr Details zum geschätzten Ausführungsplan abrufen als mit der Standardformatierungsoption.

Oracle SQL Developer

Wenn Sie SQL Developer installiert haben, können Sie den geschätzten Ausführungsplan für jede SQL-Abfrage problemlos abrufen, ohne den Befehl EXPLAIN PLAN FOR voranstellen zu müssen:

Geben Sie hier die Bildbeschreibung ein

Der tatsächliche SQL-Ausführungsplan

Der eigentliche SQL-Ausführungsplan wird vom Optimierer beim Ausführen der SQL-Abfrage generiert. Im Gegensatz zum geschätzten Ausführungsplan müssen Sie die SQL-Abfrage ausführen, um den tatsächlichen Ausführungsplan zu erhalten.

Der tatsächliche Plan sollte sich nicht wesentlich vom geschätzten Plan unterscheiden, solange die Tabellenstatistiken von der zugrunde liegenden relationalen Datenbank ordnungsgemäß erfasst wurden.

GATHER_PLAN_STATISTICS Abfragehinweis

Um Oracle anzuweisen, den tatsächlichen Ausführungsplan für eine bestimmte SQL-Abfrage zu speichern, können Sie den GATHER_PLAN_STATISTICSAbfragehinweis verwenden:

SELECT /*+ GATHER_PLAN_STATISTICS */
  p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Um den tatsächlichen Ausführungsplan zu visualisieren, können Sie Folgendes verwenden DBMS_XPLAN.DISPLAY_CURSOR:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))

Aktivieren Sie STATISTICS auf DB-Verbindungsebene

Wenn Sie die Ausführungspläne für alle in einer bestimmten Sitzung generierten Abfragen abrufen möchten, können Sie die STATISTICS_LEVELSitzungskonfiguration auf ALL setzen:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

Dies hat den gleichen Effekt wie das Festlegen des GATHER_PLAN_STATISTICSAbfragehinweises für jede Ausführungsabfrage. Genau wie beim GATHER_PLAN_STATISTICSAbfragehinweis können Sie also DBMS_XPLAN.DISPLAY_CURSORden tatsächlichen Ausführungsplan anzeigen.

Sie sollten die STATISTICS_LEVELEinstellung auf den Standardmodus zurücksetzen, sobald Sie die gewünschten Ausführungspläne gesammelt haben. Dies ist sehr wichtig, insbesondere wenn Sie Verbindungspooling verwenden und Datenbankverbindungen wiederverwendet werden.

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
Vlad Mihalcea
quelle