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.
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.
Antworten:
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
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.
Dies ist eine sehr häufige Frage, daher habe ich beschlossen, diese Antwort in einen Artikel umzuwandeln .
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.
Wenn Sie bei Verwendung von Oracle den EXPLAIN PLAN FOR
Befehl 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.
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:
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.
Um Oracle anzuweisen, den tatsächlichen Ausführungsplan für eine bestimmte SQL-Abfrage zu speichern, können Sie den GATHER_PLAN_STATISTICS
Abfragehinweis 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'))
Wenn Sie die Ausführungspläne für alle in einer bestimmten Sitzung generierten Abfragen abrufen möchten, können Sie die STATISTICS_LEVEL
Sitzungskonfiguration auf ALL setzen:
ALTER SESSION SET STATISTICS_LEVEL='ALL'
Dies hat den gleichen Effekt wie das Festlegen des GATHER_PLAN_STATISTICS
Abfragehinweises für jede Ausführungsabfrage. Genau wie beim GATHER_PLAN_STATISTICS
Abfragehinweis können Sie also DBMS_XPLAN.DISPLAY_CURSOR
den tatsächlichen Ausführungsplan anzeigen.
Sie sollten die
STATISTICS_LEVEL
Einstellung 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'