Oracle: Gibt es ein Tool zum Verfolgen von Abfragen, z. B. Profiler für SQL Server? [geschlossen]


84

Ich arbeite mit SQL Server, aber ich muss zu einer Anwendung mit Oracle DB migrieren. Um meine Anwendungsabfragen zu verfolgen, verwende ich in SQL Server ein wunderbares Profiler-Tool. Gibt es etwas Äquivalentes für Oracle?


38
Warum hast du eine falsche Antwort akzeptiert? Plan erklären TUN NICHT, was der Profiler tut. Es hat nichts damit zu tun.
Jasmine

1
Hast du das beste Werkzeug gefunden sql server profiler? Was benutzt du jetzt?
Shahid Ghafoor

Ich habe ein Buch über die Verfolgung von Oracle-Anwendungen geschrieben. Es ist als PDF unter method-r.com verfügbar .
Cary Millsap

Schauen Sie sich den Oracle Profiler in dbForge Studio für Oracle von Devart an.
Devart

Viele Antworten unten, aber seltsamerweise niemand hat erwähnt , entweder von Oracle zwei für PL / SQL Profiler: DBMS_PROFILER(unverwässert und beschränkt, aber super-bequem) oder DBMS_HPROF(genauer , aber erfordert mehr Setup). Ich kenne SQL Server jedoch nicht, daher ist es möglich, dass es ein anderes Konzept für die Profilerstellung hat als eines der Oracle-Pakete, und Sie möchten eher die Ablaufverfolgung in Oracle.
William Robertson

Antworten:


22

Mit Oracle Enterprise Manager können Sie die aktiven Sitzungen mit der ausgeführten Abfrage, ihrem Ausführungsplan, Sperren, einigen Statistiken und sogar einem Fortschrittsbalken für die längeren Aufgaben ü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 Registerkarte SQL jeder Sitzung an.

Es gibt andere Möglichkeiten. Der Enterprise Manager zeigt nur in hübschen Farben an, was in speziellen Ansichten wie den hier dokumentierten bereits verfügbar ist: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

Natürlich können Sie auch Explain PLAN FOR, das TRACE-Tool und unzählige andere Instrumentalisierungsmethoden verwenden. Es gibt einige Berichte im Enterprise Manager für die teuersten SQL-Abfragen. Sie können auch die letzten im Cache gespeicherten Abfragen durchsuchen.


17

Ich habe eine einfache Lösung gefunden

Schritt 1. Stellen Sie mit einem Administrator eine Verbindung zur Datenbank her, indem Sie PLSQL oder sqldeveloper oder eine andere Abfrageoberfläche verwenden

Schritt 2. Führen Sie das folgende Skript 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 Werte der Eingabeparameter (für Funktionsaufrufe) anzuzeigen, aber zumindest können wir sehen, was in Oracle ausgeführt wird und in welcher Reihenfolge, ohne ein bestimmtes Tool zu verwenden.


2
Sie können S.SQL_FULLTEXT hinzufügen, wenn der Abfragetext mehr als 1000 Zeichen enthält, da SQL_TEXT an diesem Punkt abgeschnitten wird.
Tridus

2
Sie sollten nicht nach LAST_ACTIVE_TIME bestellen, da es sich um VARCHAR2 (19) handelt. Verwenden Sie stattdessen Folgendes: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'JJJJ-MM-TT / HH24: MI: SS') desc
Igor Krupitsky

1
ORA-00942: Tabelle oder Ansicht existiert nicht 00942. 00000 - "Tabelle oder Ansicht existiert nicht" * Ursache: * Maßnahme: Fehler in Zeile: 11 Spalte: 6 Bedeutet das, dass ich keine Administratorrechte habe?
Toha

Dies beinhaltet keine Parameterwerte. Wenn Sie das auch haben möchten, werfen Sie einen Blick auf: stackoverflow.com/a/14217618/6339469
HamedH

16
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 Seiten- 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 Ereignis 10046 mit der Ablaufverfolgung beginnen. Der vierte Parameter legt die Ablaufverfolgungsstufe fest (12 ist die größte):

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

- Deaktivieren Sie die Ablaufverfolgung mit der Einstellung Null:

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

/ * mögliche Pegel: 0 - ausgeschaltet 1 - minimaler Pegel. Ähnlich wie set sql_trace = true 4 - Bindungsvariablenwerte werden zur Tracedatei 8 hinzugefügt - Wartezeiten werden hinzugefügt 12 - sowohl Bindungsvariablenwerte als auch Warteereignisse werden hinzugefügt * /

--same, wenn Sie Ihre eigene Sitzung mit größerem Level verfolgen möchten:

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

--schalte aus:

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'; 

--finieren Sie, um TKPROFdie Ablaufverfolgungsdatei 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>

- Um den Status der Tracedatei anzuzeigen, verwenden Sie:

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 irgendwie übersetzt http://www.sql.ru/faq/faq_topic.aspx?fid=389 Original ist voller, aber trotzdem ist dies besser als das, was andere meiner Meinung nach gepostet haben


Viel nützlicher als die anderen Antworten!
Andomar

Zu kompliziert. Niemand wird es benutzen.
ADM-IT

7

GI Oracle Profiler v1.2

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

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


Hallo, benötigen Sie eine spezielle Lizenz von ORACLE, um diese Software nutzen zu können? Ich weiß, dass Sie mit Oracle bestimmte Tabellen / Ansichten abfragen können. Wenn Sie dies tun und keine Lizenz dafür haben, werden Ihnen zusätzliche Gebühren berechnet.
Sergiu

2
Hallo, müssen Sie bezahlen, um v $ sqlarea abzufragen? Ich kann den Link eingeben, der sagt, was?
Pio

Hervorragend danke Mann !!! Sie sparen mir viel Arbeit
Hernaldo Gonzalez

Wenn meine Abfrage fehlschlägt, wird sie vom Profiler nicht angezeigt.
ADM-IT


5

Da ich gerade eine aktuelle Frage als Duplikat abgestimmt und in diese Richtung gezeigt habe. . .

Ein paar weitere - in SQL * Plus - SET AUTOTRACE ON - geben einen Erklärungsplan und Statistiken für jede ausgeführte Anweisung.

TOAD ermöglicht auch die clientseitige Profilerstellung.

Der Nachteil dieser beiden ist, dass sie Ihnen nur den Ausführungsplan für die Anweisung mitteilen, nicht jedoch, wie der Optimierer zu diesem Plan gelangt ist. Dazu benötigen Sie eine serverseitige Ablaufverfolgung auf niedrigerer Ebene.

Ein weiterer wichtiger Punkt, den Sie verstehen sollten, sind Statspack-Snapshots. Sie sind eine gute Möglichkeit, die Leistung der gesamten Datenbank zu betrachten. Erklären Sie, dass Plan usw. gut darin sind, einzelne SQL-Anweisungen zu finden, bei denen es sich um Engpässe handelt. Statspack kann gut erkennen, dass Ihr Problem darin besteht, dass eine einfache Anweisung mit einem guten Ausführungsplan 1 Million Mal pro Minute aufgerufen wird.


3

Der Catch ist Capture all SQL, das zwischen zwei Zeitpunkten ausgeführt wird. So wie es auch SQL Server tut.

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

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

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

Mit dem folgenden Verfahren werden zwei Tabellen erstellt, die jeweils einen Snapshot der Datenbank an einem bestimmten Punkt enthalten. Die Tabellen werden dann abgefragt, um eine Liste aller SQL-Ausführungen während dieses Zeitraums zu erstellen.

Wenn möglich, sollten Sie dies auf einem leisen Entwicklungssystem tun - andernfalls besteht die Gefahr, dass Sie viel zu viele Daten zurückerhalten.

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

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
  2. Lassen Sie den Benutzer seine Aufgabe in der Anwendung ausfü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 Nachdem Sie die SQL erfasst haben, ist es 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 den SQL selbst an: setze Seiten 999 Zeilen 100 break auf 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 Snapshot-Tabellen zu entfernen, wenn Sie fertig sind:

drop table sql_exec_before
/

drop table sql_exec_after
/

Vielen Dank für vollständige Skripte, die die Technik demonstrieren.
Roman Pokrovskij

2

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

Oracle stellt die explain planAnweisung ' ' bereit, mit der die Abfrage analysiert, aber nicht ausgeführt wird. Stattdessen wird eine spezielle Tabelle ausgefüllt, die Sie abfragen können (die Plan-Tabelle).

Die Syntax (einfache Version, es gibt andere Optionen, z. B. um die Zeilen in der Plan-Tabelle mit einer speziellen ID zu markieren oder eine andere Plan-Tabelle zu verwenden) lautet:

explain plan for <sql query>

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



1

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

Verknüpfung


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.