Wie zuverlässig erhalten die SQL_ID einer Abfrage

Ich weiß, dies scheint eine einfache Frage, für die Sie vielleicht denken, bereits vorhandene Antworten existieren. Allerdings ...

Verstehen, dass ich will, dass es vernünftig in der Leistung, so dass es ermöglicht werden protokolliert, für jede einzelne Abfrage ausgeführt - oder zumindest die großen - ohne viel Aufwand.

Meine erste Idee war diese-Abfrage:

select sid,serial#,prev_sql_id from v$session where audsid=userenv('sessionid');

Meine Idee war, wenn ich diesen starte gleich nach meinem Ziel-Abfrage, die ich erfassen die richtige sql_id durch prev_sql_id.

Aber ... ich war nicht ... ich war immer eine andere SQL ... anscheinend zwischen meinen target-SELECT-Anweisung der Abfrage für prev_sql_id etwas anderes lief. In meinem Fall ist die Überwachung aktiviert ist, und ich war die Erfassung der insert in die SYS.AUD$ Tabelle. Nicht gut.

Als mein Hauptziel für diesen Versuch war die Aufnahme der Ausführungsplan für die Abfrage (als es ausgeführt wurde und gefangen von der shared pool), dachte ich mir, dass ich stattdessen einfach diese Abfrage ausführen:

SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());

Dokumentation besagt, dass mit NULL SQL_ID als parameter, es wird führen Sie die explain-plan auf der letzten Abfrage lief. Ich hatte gehofft, dass dieser aufpassen würde früher Probleme. Allerdings ... habe ich den plan für den genau gleichen Einsatz in die SYS.AUD$ Tabelle.

Könnte man sagen, ok, dann eben einfach einen Kommentar in Ihrer Abfrage, ermöglicht das einfache erfassen der SQL_ID, wie in folgenden:

SELECT /* SQL: 1234-12' */ FROM DUAL;

Dann kann ich versuchen Sie zu finden, die SQL_ID wie folgt:

SELECT * FROM V$SQLAREA WHERE sql_text like '%SQL: 1234-12%';

Dass mir mehrere mögliche Kandidaten, von denen die V$SQLAREA Abfrage selbst ist ebenfalls enthalten. Das problem hier ist, dass ich müssen zufällig jeder Abfrage lief, das würde mich immer ein hard-parse.

Ich habe versucht, andere Lösungen wo ich durch die Geschichte gehen, aber das kommt in einem viel größeren Kosten. Ich habe versucht, die Suche nach anderen Lösungen. Sie alle scheinen zu isolieren, in gewisser Weise.

Verwandte Artikel:

Danke YoYo. Können Sie Ihre oracle-version, und wenn der 12c-ära, ob adaptive Pläne aktiviert sind? Ich Frage, weil du erwähnt das Ihr primärer Zweck war es, zu erfassen, wird der Ausführungsplan für die Abfrage, und die Laufzeit Einfluss von adaptive Pläne ändern können die verfügbaren Ansätze für die Bewertung xplans. Auch, Sie planen, dies zu tun in einer Produktionsumgebung oder vorübergehend in der Entwicklung? Ich bin daran interessiert, ob ausschalten der überwachung, während Sie diese Auswertung ist eine verfügbare option für Sie.
Ich hörte nie über ein Konzept, wie die Entwicklung oder die Produktion? Also ja - ich habe eine Produktionsumgebung und das ist es - kein ausschalten der überwachung. Eigentlich ist es mehr als eine solche DB, gingen wir zu 12c für die meisten, aber nicht alle.. Die wichtigsten brauchen, ist die track-performance für Berichte entwickelt, die als Teil einer Java-Web-Anwendung. Noch nicht sicher über die 'adaptive Pläne, denn ich bin noch nicht vertraut mit dem Begriff.
über "adaptive Pläne' - vielleicht können wir uns darauf konzentrieren, wie die sql_id, vielleicht vereinfacht das die Frage. Immer den execution plan vielleicht einfach nur eines der Ziele.
Die edition ist wohl wichtiger, als die version. Wenn Sie Enterprise-Edition und eine Lizenz erhalten haben, die Diagnose-pack, gibt es mehrere Möglichkeiten, diese Informationen zu erhalten, mit AWR (Active Workload Repository).
Werfen Sie einen Blick auf stackoverflow.com/questions/4376329/... für das sample code zu finden, sql_id durch die zuletzt ausgeführte sql-text (vollständig oder teilweise).

InformationsquelleAutor YoYo | 2017-03-15

Schreibe einen Kommentar