Wait Event Time Distribution
Oft ist es interessant wie viele Wait Events wie lange warten (in ms). Die Abfrage ist wie üblich RAC tauglich und funktioniert selbstverständlich auch bei einer Single Instance. Alle Wait Events, die kein einziges Wait aufweisen, werden automatisch unterdrückt.
Auf die Frage: "Enter value for event_name:" kann man einfach ENTER drücken um alle zu bekommen, oder Teile vom Event Namen - Beispielsweise "log" um die Events rund um die Online Logfiles anzuzeigen.
column event format a60
column wait_class format a16
with myevents as
(select /*+ MATERIALIZE */ eh.inst_id, eh.event, wait_class, eh.wait_time_milli, sum(eh.wait_count) wait_count
from gv$event_histogram eh join v$event_name en on (eh.event# = en.event#)
where wait_time_milli != -1
/* Wenn man keine Frage haben moechte, die naechste Zeile loeschen */
and event like '%&event_name%'
group by inst_id, event, wait_class, wait_time_milli
)
, subq as
(select inst_id, event, wait_class, wait_time_milli, wait_count
from (select inst_id, event, wait_class, to_char(wait_time_milli) wait_time_milli, wait_count
from myevents where wait_time_milli <= 4096
union all
select inst_id, event, wait_class, '> 4096ms', sum(wait_count)
from myevents where wait_time_milli > 4096
group by inst_id, event, wait_class, '> 4096ms'
)
)
select
*
from
subq
pivot (
max(wait_count)
for wait_time_milli in ('1','2','4','8','16','32','64','128','256','512','1024','2048','4096','> 4096ms')
)
order by
wait_class, event, inst_id;
Spalten und Ihre Bedeutung
Die Spalten haben folgende Bedeutung:
-
INST_ID ... Welche Instanz - im Fall von Single Instance immer 1.
-
EVENT ... Name des Wait Events
-
WAIT_CLASS ... Zu welcher Art von Waits zählt dieser Event. Die Wait Class wird beispielsweise im Oracle Enterprise Manager auf der Performance Seite als Unterteilung/Groupierung der einzelnen Waits genutzt.
-
von 1 bis 4096 ... die Anzahl der Waits, die entsprechend viele Millisekunden gewartet haben. Dabei ist es so zu verstehen, dass bei "4" die Anzahl der Waits zwischen größer 2ms bis inklusive 4ms gemeint sind. Bei "> 4096ms sind alle Waits, die länger als 4096ms gedauert haben, gezählt.
Wichtiger Hinweis zu den Events
Nicht alle Wait Events bedeuten auch wirklich warten - hier sind die wichtigsten Ausnahmen (Liste möglicherweise nicht Vollständig, da immer wieder neue Wait Events dazu kommen können).
-
SQL*NET message from client - hier wartet der Datenbank Benutzer Server Prozess, dass der Client endlich mal wieder was will.
-
SQL*Net more data from client - hier wartet der Datenbank Benutzer Server Prozess, dass der Client die nächsten Daten schickt.
-
Die "idle" Events - Beispielsweise: "shared server idle wait", hier warten Hintergrundprozesse darauf, dass es etwas zu tun gibt - das ist OK und soll so sein.
-
Die "timer" Events - Beispielsweise: "smon timer", hier warten Hintergrundprozesse darauf, dass Sie mal wieder einen Routinecheck machen sollen. Wenn etwas akut zu tun wäre, würden sie von anderen Prozessen aufgeweckt werden.
-
Die "slave" Events - Beispielsweise: "jobq slave wait", hier warten Hintergrund-Slaveprozesse darauf, von seinem Manager Aufgaben übertragen zu bekommen.
-
Die "Data Guard" Events - Beispielsweise: "Data Guard: Gap Manager", abhängig davon ob (und wie) Data Guard überhaupt genutzt wird, hat der Prozess mehr oder weniger viel zu tun.
Beispielergebnis
Hier ein Beispielergebnis, wenn man auf die Frage nach dem Event Namen "log" eingibt. Aus Platzgründen ist das Ergebnis zwischen 8ms und 4096ms hier mit "..." dargestellt.
INST_ID EVENT WAIT_CLASS '1' '2' '4' '8' ... '4096' '> 4096ms'
------- ------------------------- ------------- ----- ----- ----- ----- ... ------ ----------
1 log file sync Commit 1 0 8 546 ... 1
1 log buffer space Configuration 0 0 0 1 ...
1 log file parallel write System I/O 0 372 4710 28544 ... 6 4
1 log file sequential read System I/O 2431 101 73 78 ... 12 1
1 log file single write System I/O 0 4 7 12 ...