2008-09-23 9 views
8

Ich habe eine gespeicherte Prozedur, die aus einer einzelnen SELECT-Abfrage besteht, die zum Einfügen in eine andere Tabelle verwendet wird, basierend auf einer kleinen Mathematik, die mit den Argumenten in der Prozedur ausgeführt wird. Kann ich den Plan, der für diese Abfrage verwendet wird, generieren, indem ich irgendwie auf die Prozedur verweise, oder muss ich die Abfrage kopieren und einfügen und Bindungsvariablen für die Eingabeparameter erstellen?Plan für Abfrage in einer gespeicherten Prozedur erklären

Antwort

7

Verwenden Sie SQL Trace and TKPROF. Öffnen Sie beispielsweise SQL * Plus, und dann geben Sie den folgenden Code: -

alter session set tracefile_identifier = 'something-unique' 
alter session set sql_trace = true; 
alter session set events '10046 trace name context forever, level 8'; 

select 'right-before-my-sp' from dual; 
exec your_stored_procedure 

alter session set sql_trace = false; 

Sobald dies geschehen ist, gehen Sie Ihre Datenbank des udump Verzeichnis für eine TRC-Datei suchen mit „etwas-unique“ im Dateinamen. Formatieren Sie diese TRC-Datei mit TKPROF, öffnen Sie dann die formatierte Datei und suchen Sie nach der Zeichenfolge "Right-before-my-sp". Der SQL-Befehl, der von Ihrer gespeicherten Prozedur ausgegeben wird, sollte kurz nach diesem Abschnitt sein, und unmittelbar unter dieser SQL-Anweisung ist der Plan für die SQL-Anweisung.

Edit: Für die Zwecke der vollständigen Offenlegung, sollte ich all jenen danken, die mir Antworten auf this thread letzte Woche, die mir lernen geholfen, wie dies zu tun.

+0

Große Antwort Mike. Danke für den Tipp. –

+0

Ich muss es an andere hier in der Gruppe weitergeben, sie haben mich erst letzte Woche mit SQL Trace und TKPROF angefangen. –

1

Soweit ich verstehe, wurde dies absichtlich gemacht. Die Idee ist, dass einzelne Abfragen innerhalb der Prozedur vom Optimierer getrennt betrachtet werden. Daher ist EXPLAIN PLAN nicht sinnvoll für eine gespeicherte Prozedur, die mehrere Abfragen/Anweisungen enthalten könnte.

Die aktuelle Antwort ist NEIN, Sie können es nicht gegen einen Proc ausführen, und Sie müssen es gegen die einzelnen Anweisungen selbst ausführen. Schwierig, wenn Sie Variablen und Berechnungen haben, aber so ist es.

1

Viele Tools, wie Toad oder SQL Developer, werden Sie beim Ausführen eines EXPLAIN-Plans zur Eingabe der Bindevariablenwerte auffordern. Sie müssten dies manuell in SQL * Plus oder anderen Tools tun.

Sie können auch die SQL-Ablaufverfolgung aktivieren und die gespeicherte Prozedur ausführen und dann den EXPLAIN-Plan aus der Ablaufverfolgungsdatei abrufen.

Achten Sie darauf, dass Sie nicht nur den EXPLAIN-Plan für die SELECT-Anweisung abrufen. Das Vorhandensein der INSERT-Klausel kann das Optimierungsziel von den ersten Zeilen in alle Zeilen ändern.

Verwandte Themen