98 Stimmen

Oracle: Gibt es ein Tool zum Verfolgen von Abfragen, ähnlich wie der Profiler für SQL Server?

Ich arbeite mit SQL Server, aber ich muss zu einer Anwendung mit einer Oracle-Datenbank migrieren. Um meine Anfragen zu verfolgen, benutze ich beim SQL Server das wunderbare Profiler-Tool. Gibt es etwas Ähnliches für Oracle?

5voto

JulesLt Punkte 1745

Weil ich gerade eine kürzliche Frage als Duplikat markiert und in diese Richtung verwiesen habe . . .

Noch ein paar - in SQL*Plus - SET AUTOTRACE ON - gibt Erklärungsplan und Statistiken für jede ausgeführte Anweisung.

TOAD ermöglicht auch das Client-seitige Profiling.

Der Nachteil von beiden ist, dass sie dir nur den Ausführungsplan für die Anweisung mitteilen, aber nicht, wie der Optimierer zu diesem Plan gekommen ist - dafür benötigst du serverseitiges Tracing auf niedrigerer Ebene.

Ein weiterer wichtiger Punkt zu verstehen sind Statspack-Snapshots - sie sind eine gute Möglichkeit, die Leistung der Datenbank als Ganzes zu betrachten. Der Erklärungsplan usw. sind gut geeignet, um einzelne SQL-Anweisungen zu finden, die Engpässe darstellen. Statspack ist gut darin zu identifizieren, dass dein Problem darin besteht, dass eine einfache Anweisung mit einem guten Ausführungsplan innerhalb einer Minute 1 Million Mal aufgerufen wird.

4voto

JaMeEL Punkte 46

Der Trick besteht darin, alle SQL-Anweisungen zwischen zwei Zeitpunkten zu erfassen. Ähnlich wie es auch SQL Server tut.

Es gibt Situationen, in denen es nützlich ist, das SQL zu erfassen, das ein bestimmter Benutzer in der Datenbank ausführt. Normalerweise würden Sie einfach die Sitzungsverfolgung für diesen Benutzer aktivieren, aber es gibt zwei potenzielle Probleme bei diesem Ansatz.

  1. Das erste ist, dass viele webbasierte Anwendungen einen Pool persistenter Datenbankverbindungen pflegen, die von mehreren Benutzern gemeinsam genutzt werden.
  2. Das zweite ist, dass einige Anwendungen sehr schnell eine Verbindung herstellen, einige SQL-Befehle ausführen und sich wieder trennen, was es schwierig macht, die Sitzungsverfolgung überhaupt zu aktivieren (Sie könnten natürlich einen Logon-Trigger verwenden, um die Sitzungsverfolgung in diesem Fall zu aktivieren).

Ein schneller und einfacher Lösungsansatz für das Problem besteht darin, alle SQL-Anweisungen zu erfassen, die zwischen zwei Zeitpunkten ausgeführt werden.

Das folgende Verfahren erstellt zwei Tabellen, von denen jede einen Schnappschuss der Datenbank zu einem bestimmten Zeitpunkt enthält. Anschließend werden die Tabellen abgefragt, um eine Liste aller innerhalb dieses Zeitraums ausgeführten SQL-Befehle zu erstellen.

Wenn möglich, sollten Sie dies auf einem ruhigen Entwicklungssystem durchführen - andernfalls riskieren Sie, viel zu viele Daten zurückzubekommen.

  1. Erstellen des ersten Schnappschusses Führen Sie den folgenden SQL-Befehl aus, um den ersten Schnappschuss zu erstellen:

    create table sql_exec_before as
    select executions, hash_value
    from v$sqlarea
    /
  2. Bitten Sie den Benutzer, seine Aufgabe in der Anwendung auszuführen.

  3. Erstellen des zweiten Schnappschusses.

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
  4. Überprüfen der Ergebnisse Nachdem Sie das SQL erfasst haben, ist es an der Zeit, die Ergebnisse abzufragen.

Diese Abfrage listet alle ausgeführten Abfrage-Hashes auf:

select  aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
  on aft.hash_value  =  bef.hash_value 
where aft.executions > bef.executions
   or bef.executions is null;
/

Diese Abfrage zeigt den Hash und das eigentliche SQL an: set pages 999 lines 100 break on hash_value

select  hash_value, sql_text
from    v$sqltext
where   hash_value in (
    select  aft.hash_value
    from sql_exec_after aft
    left outer join sql_exec_before bef
      on aft.hash_value  =  bef.hash_value
    where aft.executions > bef.executions
       or bef.executions is null;
)
order by
    hash_value, piece
/

5. Aufräumen Vergessen Sie nicht, die Schnappschusstabellen zu löschen, sobald Sie fertig sind:

drop table sql_exec_before
/

drop table sql_exec_after
/

2voto

paxdiablo Punkte 809679

Oracle analysiert zusammen mit anderen Datenbanken eine gegebene Abfrage, um einen Ausführungsplan zu erstellen. Dieser Plan ist der effizienteste Weg, um die Daten abzurufen.

Oracle bietet die 'explain plan' Anweisung, die die Abfrage analysiert, aber nicht ausführt, sondern stattdessen eine spezielle Tabelle erstellt, die abgefragt werden kann (die Plan-Tabelle).

Die Syntax (einfache Version, es gibt andere Optionen wie das Markieren der Zeilen in der Plan-Tabelle mit einer speziellen ID oder die Verwendung einer anderen Plan-Tabelle) lautet:

explain plan for 

Die Analyse dieser Daten wird in einer anderen Frage oder Ihrer weiteren Recherche behandelt.

2voto

user449251 Punkte 21

Es gibt ein kommerzielles Tool FlexTracer, das verwendet werden kann, um Oracle-SQL-Abfragen zu verfolgen

1voto

Code Trawler Punkte 323

Dies ist ein Oracle-Dokument, das erklärt, wie SQL-Abfragen verfolgt werden können, einschließlich einiger Tools (SQL Trace und tkprof)

link

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X