Langlaufende Operationen, SQL Monitoring (auch Real-time Monitoring) und Active Reports
von Ulrike Schwinn, ORACLE Deutschland GmbH

Das Monitoring der Datenbank ist für Datenbankadministratoren wie auch für Datenbankentwickler ein wichtiger Bestandteil ihrer Aufgaben - besonders auch in Zeiten von Ressource-Engpässen bzw. Performanceproblemen. Speziell beim Testen von neuen Anwendungen, neuen Techniken oder Features ist das Monitoring ein wichtiger Schritt im Testablauf.

Die Datenbank selbst stellt ein eigenes Framework zur Verfügung, um ohne Verwendung von externen Werkzeugen und ohne zusätzliche Installation ein genaues Monitoring zu erlauben. Das Framework umfasst seit jeher spezielle Data Dictionary Views, V$-Tabellen, PL/SQL-Packages für verschiedene Advisory-Aufgaben und ein spezielles Workload Repository. In jedem neuen Datenbankrelease wächst der Funktionsumfang dieses Frameworks - so auch in Oracle Database 11g mit Real-time Monitoring (auch SQL Monitoring ) und den Active Reports. Viele dieser Funktionen sind mittlerweile graphisch in der Enterprise Manager Database Control Konsole oder im aktuellen Grid Control implementiert, so dass die Nutzung sehr einfach und intuitiv ist.

In diesem Tipp konzentrieren wir uns auf die langlaufenden Transaktionen, das Real-time Monitorung und die Active Reports. Dabei werden folgende Techniken benutzt:

  • V$SESSION_LONGOPS
  • DBMS_APPLICATION_INFO
  • V$SQL_MONITOR
  • DBMS_SQLTUNE
  • Enterprise Manager Database Control und Grid Control


Monitoring von langlaufenden Operationen mit V$SESSION_LONGOPS
Monitoring von langlaufenden Operationen ist schon seit langer Zeit über die View V$SESSION_LONGOPS möglich. Bestimmte Oracle- oder Benutzer- definierte Operationen wie SELECT, DDL-, DML-, oder auch RMAN- oder DATAPUMP- Kommandos gehören zu diesen Operationen. Laut Oracle Database Reference Handbuch werden diese Operationen nach Ablauf von 6 Sekunden in der View als langlaufende Operationen angezeigt.

Folgendes Beispiel zeigt eine einfache Anwendung.
SQL> SELECT opname, username, 
     to_char(start_time,'DD-MON-YYYY HH24:MI:SS'),
     (sofar/totalwork)*100 prozent, time_remaining 
     FROM v$session_longops
     WHERE time_remaining>0;

OPNAME
----------------------------------------------------------------
USERNAME                       TO_CHAR(START_TIME,' PROZENT TIME_REMAINING
------------------------------ -------------------- ------- --------------
Gather Schema Statistics
SYS                            16-JUN-2010 15:26:32      50              4
Ab Oracle 10g wird auch eine vom User ausgeführte ROLLBACK-Operation nach einer langlaufenden DML-Operation in V$SESSION_LONGOPS mitgeloggt. Folgendes Beispiel zeigt die Zeitdauer der ROLLBACK-Operation in Sekunden.
SQL> SELECT opname, username,
     to_char(start_time,'DD-MON-YYYY HH24:MI:SS'),
     (sofar/totalwork)*100 prozent, time_remaining
     FROM v$session_longops
     WHERE time_remaining>0;

OPNAME
----------------------------------------------------------------
USERNAME                       TO_CHAR(START_TIME,'    PROZENT TIME_REMAINING
------------------------------ -------------------- ---------- --------------
Transaction Rollback
SH                             26-AUG-2010 15:43:00 91.7590224              3
Das Ergebnis zeigt, dass gerade eine DBMS_STATS- Operation aktiv ist und in ungefähr 4 Sekunden (siehe Spalte TIME_REMAINING) beendet ist. Mit dem Package DBMS_APPLICATION_INFO ist es darüberhinaus sogar möglich, die Spalten der View für Benutzer geschriebene Module selbst zu bestimmen. Speziell das Unterprogramm SET_SESSION_LONGOPS des Packages DBMS_APPLICATION_INFO fügt eine Zeile in die View V$SESSION_LONGOPS ein, um den Fortschritt einer Operation festzulegen.

Folgender Beispielausschnitt zeigt die Verwendung.
...
l_rindex:=dbms_application_info.set_session_longops_nohint;    
...
dbms_application_info.set_session_longops(
   rindex       => l_rindex, 
   slno         => l_slno, 
   op_name      => 'Lauf: '||l_seq, 
   target       => null,
   context      => null,
   sofar        => l_loopcnt,
   totalwork    => l_count,            
   target_desc  => 'Produkte', 
   units        => 'Anzahl'
   );
... 
Die Argumente OP_NAME, TARGET, CONTEXT, SOFAR, TOTALWORK, TARGET_DESC und UNITS geben die Inhalte der generierten Zeile von V$SESSION_LONGOPS vor. Das Argument für RINDEX wird mit einem Aufruf von DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS_NOHINT gefüllt und dient als "Row Index" für die Zeile. Das Argument SLNO ist nur für den internen Gebrauch vorgesehen und wird nicht gesetzt.

Die Ergebnisabfrage auf V$SESSION_LONGOPS sieht dann folgendermassen aus:
SQL> SELECT sid, serial#, message, (sofar/totalwork)* 100 prozent
     FROM v$session_longops
     WHERE time_remaining>0;

       SID    SERIAL# MESSAGE                                            PROZENT
---------- ---------- -------------------------------------------------- -------
        26      35283 Lauf: 1: Produkte : 569247 out of 918843 Anzahl      61.95
                      done

In unserem Beispiel wird die Spalte MESSAGE der View V$SESSION_LONGOPS aus den Argumenten von OP_NAME, TARGET_DESC und UNITS von SET_SESSION_LONGOPS aus den Werten im Listing zusammengesetzt. SOFAR und TOTALWORK setzen sich aus der Zählervariable L_LOOPCNT und den Werten von L_COUNT der Applikation zusammen. Alle Informationen sind frei wählbar und werden nicht überprüft, so dass der Informationsgehalt abhängig von der eigenen Definition dieser Spalten ist. Eine genaue Beschreibung der Prozedur SET_SESSION_LONGOPS findet sich im Handbuch unter SET_SESSION_LONGOPS Procedure.


SQL Monitoring in 11g
Häufig stellen sich allerdings folgende Fragen, die über die Funktion von V$SESSION_LONGOPS hinausreichen:
  • Wie kann man alle SQL Statements mit hohen Antwortzeiten finden?
  • Welche Operationen dieser SQL Abfragen sind zeitintensiv?
  • Welche Statements laufen parallel?
  • Können die Statements auch in Echtzeit (real-time) überwacht werden?
Mit der Einführung von 11g steht nun das SQL Monitoring (auch Real-time Monitoring) Feature zur Verfügung, das im Linemode oder auch graphisch Verwendung findet. Die Linemode-Implementierung nutzt die neuen Views V$SQL_MONITOR und V$SQL_PLAN_MONITOR und für das Reporting die Funktion REPORT_SQL_MONITOR des Package DBMS_SQLTUNE. Das SQL Monitoring wird dabei automatisch gestartet, wenn ein SQL-Statement eine der folgenden Voraussetzungen erfüllt:
  • parallele Ausführung
  • Verbrauch von mehr als 5 Sekunden CPU bzw. I/O Zeit
  • Verwendung des MONITOR Hints
Wichtiger Hinweis: Für die Verwendung ist das Tuning Pack notwendig.

Das folgende Listing zeigt eine einfache Anwendung der neuen Views.
SQL> -- Überprüfung auf Verwendung des Tuning Packs
SQL> sho parameter pack

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_management_pack_access       string      DIAGNOSTIC+TUNING

SQL> SELECT distinct s.sql_text, m.sql_id, m.cpu_time 
  1  FROM  v$sql_monitor m INNER JOIN v$sql s ON s.sql_id=m.sql_id
  2* WHERE username='SH' ORDER BY m.cpu_time

SQL_TEXT
--------------------------------------------------------------------------------
SQL_ID          CPU_TIME
------------- ----------
insert /*+ append */ into sales select * from sales
fcb815s02apwc   12388774


SQL> SELECT distinct s.sql_text, m.sql_id, m.cpu_time 
  1  FROM  v$sql_monitor m INNER JOIN v$sql s ON s.sql_id=m.sql_id
  2* WHERE username='SH' ORDER BY m.cpu_time

SQL_TEXT
--------------------------------------------------------------------------------
SQL_ID          CPU_TIME
------------- ----------
insert /*+ append */into sales select * from sales
fcb815s02apwc   16641040

So lange das Statement ausgeführt wird, werden die Statistiken (fast) in Echtzeit erneuert. Die Informationen werden danach nicht direkt aus V$SQL_MONITOR gelöscht sondern noch einige Zeit gespeichert.

Möchte man den Report im Linemode erzeugen, ist dies mit folgender Abfrage möglich. Das Ergebnis ist ein HTML-Report, der sich im Browser anzeigen lässt.
spool monitor1.html
SELECT dbms_sqltune.report_sql_monitor(sql_id=>'fcb815s02apwc',type=>'HTML') FROM dual;
spool off
Da sich die Informationen im Report ständig ändern, ist die Anzeige in einem graphischen Werkzeug wie Enterprise Manager Database Control oder Grid Control mit automatischem oder manuellem Refresh einfacher als die Verwendung der gerade gezeigten Linemode-Variante. Der folgende Screenshot zeigt eine Übersicht der überwachten Statements im Enterprise Manager Database Control 11g Release 2. Über den Reiter "Performance" und den Link "SQL Monitoring" gelangt man zu folgender Ansicht:


Für eine größere Ansicht auf das Bild klicken.

Ein einfacher Blick auf die entsprechende Enterprise Manager Seite reicht offensichtlich aus, um erste wichtige Informationen über die kostenintensiven Statements zu erhalten. Die Spalte "Status" zeigt dabei an, ob ein Statement noch aktiv (Zeile 1 bis 4) ist, beendet (Zeile 6 bis 8) wurde, abgebrochen (Zeile 5) worden ist oder bei Einstellung des Parameters PARALLEL_DEGREE_POLICY in einer Queue (Zeile 1 und 3) wartet (siehe Tipp zu Parallel Query ganz automatisch mit Oracle 11g.).

Nicht nur reine SQL-Cursor, sondern die Ausführung jedes beliebigen Cursors kann seit 11g Release 2 überwacht werden. Dies schliesst auch PL/SQL- Aufrufe mit ein. Die letzte Zeile zeigt beispielsweise die Ausführung eines anonymen PL/SQL- Blocks. Wie bei einem SQL-Statement, werden in diesem Teil des Reports nur generelle Informationen und Statistiken über die Ausführung angezeigt.


Mehr Details über Active Reports
Wie erhalte ich nun weitere Informationen über die Ausführungen? Mit der rechten Maustaste erhält man ein spezielles Kontextmenü (siehe "Monitored SQL Execution Details") mit dem weitere Details z.B. - die sogenannten Active Reports für SQL Monitoring - angezeigt werden können.


Für eine größere Ansicht auf das Bild klicken.

Active Reports sind eine neue Art von interaktiven Reports, die über die Enterprise Manager Oberfläche oder im Linemode genutzt werden können. Es existieren Active Reports zu SQL Monitoring, SQL Detail Monitoring und dem SQL Performance Analyzer. SQL Monitoring- und SQL Performance Analyzer- Reports sind in der Enterprise Manager Database Control Konsole 11g Release 2 und im Grid Control Release 11g automatisch integriert. Der folgende Screenshot gibt einen Überblick über die Funktionen.


Für eine größere Ansicht auf das Bild klicken.

Auf den ersten Blick fällt auf, dass der Report einen Überblick über die allgemeinen Informationen wie Warte-, Zeit- und I/O Statistiken gibt. Das kleine blaue Symbol neben der "SQL ID" gibt Informationen zum verwendeten SQL- und PL/SQL-Text und den verwendeten Bindvariablen. Speichern lässt sich der HTML-Report mit dem Button "Save". Sofern die Mail-Einstellungen wie Mail-Server, Emailadresse usw. über "Setup" und "Preferences" (unter "Notification Methods") korrekt eingetragen worden sind, ist sogar zusätzlich ein Versenden des Reports möglich. Zum Ansehen des Reports ist dabei keine Installation des Enterprise Managers notwendig. Mit "View Report" wird der Report im ASCII-Format angezeigt.

Im Bereich "Details" können nun weitere Informationen und Statistiken eingesehen werden. Standardmässig werden die Operationen der Planausführung und zusätzliche Informationen wie CPU- oder Memory- Verbrauch pro Operation angezeigt. Damit wird deutlich, welche Operationen hohe Kosten verursachen.

Unter "Activity" werden der CPU-Verbrauch und die aufgetretenen Wait Events aufgelistet. In unserem Fall werden hauptsächlich "direct path write temp" Wait Events angezeigt, was durch eine hohe Sortierungsrate des ausgeführten Statements verursacht werden kann. Eine weitere Analyse ist sicher notwendig. Je nach Statement-Ausführung sind sogar zusätzliche Buttons mit Informationen zur Parallelisierung verfügbar. Der nächste Screenshot zeigt den entsprechenden Ausschnitt in der Enterprise Manager Konsole.


Für eine größere Ansicht auf das Bild klicken.

Bei PL/SQL- Ausführungen steht nur der Button "Activity" zur Verfügung. Die "Activity" wird durch die Angabe eines entsprechenden Typs wie CPU, Wait Event oder SQL ID festgelegt. Falls ein SQL Statement beispielsweise aktiv ist, wird die entsprechende SQL ID angegeben. Ein Drilldown ermöglicht das Anzeigen der zugehörigen SQL Informationen.


Für eine größere Ansicht auf das Bild klicken.

In unserem Beispiel handelt es sich beispielsweise um zwei INSERT-Statements, wobei das zweite Statement offensichtlich die meisten Ressourcen verwendet. Möchte man eine genauere Analyse des PL/SQL Codes durchführen, sollte man den zusätzlichen Einsatz des Hierachischen PL/SQL Profilers in Betracht ziehen.

Nutzt man Grid Control 11g, wird man weitere Buttons im Bereich Details vorfinden. Hilfreich kann beispielsweise der Button "Plan" sein, wie die nächsten beiden Screenshots zeigen.


Für eine größere Ansicht auf das Bild klicken.




Für eine größere Ansicht auf das Bild klicken.

Active Reports können ähnlich wie die Real-time Monitoring Reports mithilfe des Package DBMS_SQLTUNE im Linemode erzeugt werden. Wer sich damit auseinander setzen möchte, kann sich die ausführlichen Informationen auf OTN (siehe nächster Abschnitt) dazu ansehen.


Informationen und verwendete Links

Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...



Zurück zur Community-Seite