it-swarm.com.de

Oracle: Gibt es ein Tool zum Nachverfolgen von Abfragen, z. B. Profiler für SQL Server

ich arbeite mit SQL Server, aber ich muss zu einer Anwendung mit Oracle DB migrieren. Gibt es etwas Gleichwertiges für Oracle?

71
stefano m

Sie können den Oracle Enterprise Manager verwenden, um die aktiven Sitzungen mit der ausgeführten Abfrage, dem Ausführungsplan, Sperren, einigen Statistiken und sogar einer Fortschrittsanzeige für die längeren Aufgaben zu überwachen.

Siehe: http://download.Oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

Gehen Sie zu Instanz -> Sitzungen und sehen Sie sich die SQL-Registerkarte jeder Sitzung an. 

Es gibt andere Wege. Enterprise Manager fügt nur die Farben hinzu, die bereits in speziellen Ansichten verfügbar sind, wie hier beschrieben: http://www.Oracle.com/pls/db92/db92.catalog_views?remark=homepage

Natürlich können Sie auch PLAN FOR, TRACE und viele andere Arten der Instrumentalisierung verwenden. Im Enterprise Manager gibt es einige Berichte für die teuersten SQL-Abfragen. Sie können auch die letzten im Cache gespeicherten Abfragen durchsuchen.

21
borjab

Ich habe eine einfache Lösung gefunden

Schritt 1. Verbinden Sie sich mit einem Admin-Benutzer über PLSQL oder sqldeveloper oder eine andere Abfrageschnittstelle mit der Datenbank

Schritt 2. Führen Sie das Skript unten aus. In der Spalte S.SQL_TEXT sehen Sie die ausgeführten Abfragen

SELECT            
 S.LAST_ACTIVE_TIME,     
 S.MODULE,
 S.SQL_FULLTEXT, 
 S.SQL_PROFILE,
 S.EXECUTIONS,
 S.LAST_LOAD_TIME,
 S.PARSING_USER_ID,
 S.SERVICE                                                                       
FROM
 SYS.V_$SQL S, 
 SYS.ALL_USERS U
WHERE
 S.PARSING_USER_ID=U.USER_ID 
 AND UPPER(U.USERNAME) IN ('Oracle user name here')   
ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc;

Das einzige Problem dabei ist, dass ich keine Möglichkeit finde, die Eingabeparameterwerte (für Funktionsaufrufe) anzuzeigen, aber zumindest können wir sehen, was in Oracle ausgeführt wird, und die Reihenfolge davon, ohne ein bestimmtes Tool zu verwenden.

15
sergiu
alter system set timed_statistics=true

--oder 

alter session set timed_statistics=true --if want to trace your own session

- muss groß genug sein:

select value from v$parameter p
where name='max_dump_file_size' 

- Finden Sie die Sid- und Seriennummer der Sitzung heraus, an der Sie interessiert sind:

 select sid, serial# from v$session
 where ...your_search_params...

- Sie können mit dem 10046-Ereignis beginnen, der vierte Parameter legt den Trace-Level fest (12 ist der größte):

 begin
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
 end;

- Deaktivieren Sie die Verfolgung mit der Einstellung des Nullpegels:

begin
   sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

/ * mögliche Werte: 0 - ausgeschaltet 1 - minimaler Pegel. Ähnlich wie set sql_trace = true 4 - Bindungsvariablenwerte werden der Trace-Datei hinzugefügt 8 - Warten werden hinzugefügt 12 - Beide Werte für Bindungsvariablen und Warteereignisse werden hinzugefügt.

--same, wenn Sie Ihre eigene Sitzung mit einem höheren Level verfolgen möchten:

alter session set events '10046 trace name context forever, level 12';

--abschalten:

alter session set events '10046 trace name context off';

--Datei mit rohen Trace-Informationen wird gefunden:

 select value from v$parameter p
 where name='user_dump_dest'

--name der Datei (*. trc) enthält Spid:

 select p.spid from v$session s, v$process p
 where s.paddr=p.addr
 and ...your_search_params...

- Sie können den Namen auch selbst festlegen:

alter session set tracefile_identifier='UniqueString'; 

- Schließlich verwenden Sie TKPROF, um die Trace-Datei lesbarer zu machen:

C:\Oracle\admin\databaseSID\udump>
C:\Oracle\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
C:\Oracle\admin\databaseSID\udump>

--zur Status der Trace-Dateianwendung anzeigen:

set serveroutput on size 30000;
declare
  ALevel binary_integer;
begin
  SYS.DBMS_SYSTEM.Read_Ev(10046, ALevel);
  if ALevel = 0 then
    DBMS_OUTPUT.Put_Line('sql_trace is off');
  else
    DBMS_OUTPUT.Put_Line('sql_trace is on');
  end if;
end;
/

Nur eine Art übersetzte http://www.sql.ru/faq/faq_topic.aspx?fid=389 Das Original ist voller, aber trotzdem ist es besser als das, was andere IMHO geschrieben haben

14
q3kep

Testen Sie PL/SQL Developer. Es verfügt über eine benutzerfreundliche GUI-Schnittstelle für den Profiler. Es ist ziemlich schön, den Versuch auszuprobieren. Ich schwöre bei diesem Tool, wenn Sie an Oracle-Datenbanken arbeiten.

http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw

5
Kuberchaun

GI Oracle Profiler v1.2

Es ist ein Werkzeug für Oracle zum Erfassen von Abfragen, die ähnlich wie der SQL Server Profiler ausgeführt werden. Unverzichtbares Werkzeug für die Wartung von Anwendungen, die diesen Datenbankserver verwenden. 

sie können es von der offiziellen Website iacosoft.com herunterladen

4
pio

Ich habe gerade eine kürzlich gestellte Frage als Duplikat gewählt und in diese Richtung gewiesen. . .

Ein paar mehr - in SQL * Plus - SET AUTOTRACE ON - enthält Erläuterungspläne und Statistiken für jede ausgeführte Anweisung.

TOAD ermöglicht auch die Profilierung auf Clientseite.

Der Nachteil von beiden ist, dass sie nur den Ausführungsplan für die Anweisung angeben, nicht jedoch, wie der Optimierer zu diesem Plan gekommen ist. Dafür benötigen Sie eine serverseitige Ablaufverfolgung auf niedrigerer Ebene.

Ein weiteres wichtiges Element sind Statspack-Snapshots. Sie sind eine gute Möglichkeit, die Leistung der Datenbank insgesamt zu betrachten. Erklärungspläne usw. eignen sich gut, um einzelne SQL-Anweisungen zu finden, die Engpässe darstellen. Statspack erkennt die Tatsache, dass Ihr Problem darin besteht, dass eine einfache Anweisung mit einem guten Ausführungsplan 1 Million Mal in einer Minute aufgerufen wird.

4
JulesLt

versuchen Sie es (es ist auch kostenlos): http://www.aboves.com/Statement_Tracer_for_Oracle.exe

2
Babba

Catch is Capture erfasst alle SQL-Laufzeiten zwischen zwei Zeitpunkten. So wie es auch SQL Server tut.

Es gibt Situationen, in denen es hilfreich ist, die von einem bestimmten Benutzer in der Datenbank ausgeführte SQL zu erfassen. Normalerweise würden Sie einfach die Sitzungsverfolgung für diesen Benutzer aktivieren, es gibt jedoch zwei potenzielle Probleme bei diesem Ansatz.

  1. Der erste ist, dass viele webbasierte Anwendungen einen Pool persistenter Datenbankverbindungen unterhalten, die von mehreren Benutzern gemeinsam genutzt werden. 
  2. Die zweite ist, dass einige Anwendungen eine Verbindung herstellen, etwas SQL ausführen und die Verbindung sehr schnell trennen, was es schwierig macht, die Sitzungsablaufverfolgung überhaupt zu aktivieren (in diesem Fall können Sie natürlich einen Anmeldungsauslöser verwenden, um die Sitzungsablaufverfolgung zu aktivieren).

Eine schnelle und schmutzige Lösung für das Problem besteht darin, alle SQL-Anweisungen zu erfassen, die zwischen zwei Zeitpunkten ausgeführt werden.

Mit dem folgenden Verfahren werden zwei Tabellen erstellt, von denen jede eine Momentaufnahme der Datenbank an einem bestimmten Punkt enthält. Die Tabellen werden dann abgefragt, um eine Liste aller in diesem Zeitraum ausgeführten SQL-Anweisungen zu erstellen.

Wenn möglich, sollten Sie dies auf einem leisen Entwicklungssystem tun - ansonsten riskieren Sie, zu viele Daten zurückzugewinnen.

  1. Nehmen Sie den ersten Snapshot Führen Sie die folgende SQL aus, um den ersten Snapshot zu erstellen:

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

  3. Machen Sie den zweiten Schnappschuss.

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

Diese erste 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;
/

Dieser zeigt den Hash und die SQL selbst an: Seiten 999 Zeilen 100 Break auf Hashwert

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 Momentaufnahme-Tabellen zu entfernen, wenn Sie fertig sind:

drop table sql_exec_before
/

drop table sql_exec_after
/
2
JaMeEL

Es gibt ein kommerzielles Tool FlexTracer , mit dem Oracle-SQL-Abfragen verfolgt werden können

1
user449251

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

Oracle stellt die Anweisung 'explain plan' bereit, die die Abfrage analysiert, jedoch nicht ausführt. Stattdessen füllt sie eine spezielle Tabelle aus, die Sie abfragen können (die Plantabelle).

Die Syntax (einfache Version, es gibt andere Optionen, z. B. die Zeilen in der Plantabelle mit einer speziellen ID zu kennzeichnen oder eine andere Plantabelle zu verwenden):

explain plan for <sql query>

Die Analyse dieser Daten bleibt für eine andere Frage oder Ihre weitere Forschung übrig.

1
paxdiablo

Dies ist ein Oracle-Dokument, in dem erläutert wird, wie SQL-Abfragen nachverfolgt werden, einschließlich einiger Tools (SQL Trace und tkprof).

Verknüpfung

0
Code Trawler

Anscheinend gibt es kein kleines einfaches billiges Dienstprogramm, das diese Aufgabe erledigen könnte. Es gibt jedoch einen Weg, dies auf komplizierte und unbequeme Weise zu tun.

Der folgende Artikel beschreibt mehrere. Es gibt wahrscheinlich Dutzende mehr ... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm