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:
- Blog: Anzeigen und Lesen der Ausnahme von Plänen für eine SQL-Anweisung
- Oracle-Abfragen ausgeführt von einer session
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie neue SQL*Plus-option:
InformationsquelleAutor Lukasz Szozda