Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So finden Sie den Waitevent-Verlauf der Oracle-Sitzung

In diesem Beitrag werden wir uns die verschiedenen Abfragen ansehen, um den Waitevent-Verlauf der Oracle-Sitzung abzurufen.

Der Verlauf der Warteereignisse in einer bestimmten Sitzung seit Beginn kann mit der folgenden Abfrage gefunden werden

set lines 120 trimspool on
col event head „Waited for“ format a30
col total_waits head „Total|Waits“ format 999.999
col tw_ms head „Waited|for (ms)“ format 999.999,99
col aw_ms head „Average|Wait (ms)“ Format 999.999,99
col mw_ms head „Max|Wait (ms)“ Format 999.999,99
select event, total_waits, time_waited10 tw_ms,
durchschnittliche Wartezeit
10 aw_ms, max_wait*10 mw_ms
von v$session_event
wobei sid =&1
/

Angenommen, wir möchten den Warteereignisverlauf der Sitzung in einem bestimmten Zeitraum sehen, um das Warteereignis nur in diesem Zeitraum zu erhalten

Dann können wir die folgende ASH-Abfrage verwenden, um die Daten zu extrahieren

SQL> SELECT event,count()
FROM dba_hist_active_sess_history a
WHERE a.sample_time BETWEEN to_date('12-OCT-2016 11:49:00','DD-MON-YYYY HH24:MI:SS') AND
to_date('12-OCT-2016 15:04:00','DD-MON-YYYY HH24:MI:SS') und session_id=1853 und SESSION_SERIAL#=19 nach Ereignis gruppieren;
EREIGNISZAHL(
)

Protokolldateisynchronisierung 88

SQL> SELECT module,count()
2 FROM dba_hist_active_sess_history a
3 WHERE a.sample_time BETWEEN to_date('12-OCT-2016 11:49:00','DD-MON-YYYY HH24:MI:SS') UND
4 to_date('12-OCT-2016 15:04:00','DD-MON-YYYY HH24:MI:SS') und session_id=1853 und SESSION_SERIAL#=19 und event ='log file sync' group by module;
MODULE COUNT(
)

e:FND:cp:FNDICM88

Angenommen, wir möchten den Warteereignisverlauf der letzten Stunde wissen, dann kann die folgende Abfrage verwendet werden

Spalte sample_time format a30
select sample_time, session_state, event, sql_id
from v$active_session_history
where session_id =&1 and sample_time> SYSDATE – 30/(24*60)
sort by 1;

Wichtiger Anwendungsfall für die Technik.

Angenommen, wir möchten wissen, worauf eine bestimmte Sitzung während eines bestimmten Zeitraums gewartet hat und was sie blockiert hat

Wir können die folgende Abfrage verwenden, um Warteereignisse und andere wichtige Dinge zu erhalten

col event format a30
col sample_time format a25
select session_id, sample_time, session_state, event, wait_time, time_waited, sql_id, sql_child_number CH#
from v$active_session_history
where session_id =19
und sample_time between
to_date('9-DEC-16 01.25.00 PM','dd-MON-yy hh:mi:ss PM')
and
to_date( '9-DEC-16 02.25.00 PM','dd-MON-yy hh:mi:ss PM')
order by sample_time;

Wenn das Ereignis nun enq:TX – Zeilensperrkonflikt ist, wissen wir, dass eine bestimmte Sitzung es blockieren wird.

select sample_time, session_state,blocking_session, current_obj#, current_file#, current_block#, current_row#
from v$active_session_history
where sample_time between
to_date('9-DEC-16 01.25.00 PM' ,'dd-MON-yy hh:mi:ss PM')
und
to_date('9-DEC-16 02.25.00 PM','dd-MON-yy hh:mi:ss PM ')
und session_id =19
und event ='enq:TX – row lock contention'
order by sample_time;

Blocking_session zeigt die Sitzungs-ID, für die die Sitzung blockiert wurde. Wir können die SQL-Anweisung auch mit der oben erhaltenen sql_id für die blockierte Sitzung extrahieren.

Ähnliche Abfragen können verwendet werden, um die Informationen für die blockierende Sitzung zu identifizieren und dann geeignete Korrekturmaßnahmen zu ergreifen

Wichtige Informationen

Sie müssen gesehen haben, dass wir für diese Abfragen häufig den aktiven Sitzungsverlauf und das aktive Sitzungsverlaufsarchiv verwendet haben

Was ist der aktive Sitzungsverlauf

Active Session History fragt die Datenbank ab, um die aktiven Sitzungen zu identifizieren, und speichert relevante Informationen über jede von ihnen – wie die Benutzer-ID, den Status, die Maschine, von der aus sie verbunden ist, und die SQL, die sie ausführt – in einem speziellen Bereich im globalen System Bereich (SGA) der Datenbankinstanz namens ASH Buffer

Aktives Sitzungsverlaufsarchiv

Active Session History sammelt jede Sekunde Informationen über aktive Sitzungen von der Datenbankinstanz. Abhängig von der Datenbankaktivität führt dies dazu, dass viele Daten im ASH-Puffer gesammelt werden, aber da der ASH-Puffer eine speicherresidente Struktur ist, hat er nur eine begrenzte Menge an Speicherplatz. Wenn die Instanz ausfällt, verschwindet außerdem der Speicher der Instanz. Daher archiviert Oracle Database die Informationen aus dem ASH-Puffer in einer Datenbanktabelle, um sie persistent zu machen. Diese archivierten Tabellendaten sind in einer Ansicht namens DBA_HIST_ACTIVE_SESS_HISTORY

sichtbar

Verwandte Artikel

Oracle ASH (Active Session History) Nützliche Abfragen

So finden Sie heraus, welche Sid einen vollständigen Tabellenscan durchführt

So finden Sie Sitzungsdetails in der Oracle-Datenbank

Was ist DB-Zeit und durchschnittliche aktive Sitzungen, aktive Sitzung in Oracle

wie man Sitzungen findet, die viele Wiederholungen erzeugen