Title: Wait Event Enhancements in Oracle 10g
1Wait Event Enhancementsin Oracle 10g
Terry Sutton and Roger Schrag Database
Specialists, Inc. www.dbspecialists.com
2Todays Session
- Twelve wait event interface enhancements in
Oracle 10g that we really like. - Documentation gaps in some areas make this
information harder to come by. - We will assume everyone is familiar with wait
event concepts and the wait event interface in
Oracle 9i or earlier. - To learn more about wait events, read
www.dbspecialists.com/presentations.htmlwait_even
ts
3White Paper
- Contains additional detail we wont have time to
cover today. - Includes a handy reference list of all Oracle 10g
wait events, wait classes, and wait event
parameters. - Download www.dbspecialists.com/presentations
4Twelve Oracle 10g Enhancements
- More descriptive wait event names
- Wait event classes
- vevent_name new columns
- vsql / vsqlarea new columns
- vsession_wait_history
- vsession new columns
- vevent_histogram
- vsystem_wait_class / vsession_wait_class
- Active Session History (ASH)
- Automatic Workload Repository (AWR)
- Time model statistics
- Improved session tracing
5More Descriptive Names
- Prior to Oracle 10g many wait events had vague
names that covered many situations - latch free
- enqueue
- buffer busy waits
- For these waits you had to look at parameter
values to learn the wait condition. - Oracle 10g gives the most common of these types
of waits more descriptive names.
6latch free
- Prior to Oracle 10g Could indicate a wait on any
of dozens of different latches. - Oracle 10g The 26 most common latches have their
own wait event. - The rest continue to use the generic latch free
wait event.
7latch free Prior to Oracle 10g
- SQLgt SELECT event, state, p1, p2, p3 FROM
vsession_wait WHERE sid 162 - EVENT STATE P1 P2 P3
- ------------- ------- ----------- ------ -----
- latch free WAITING 15113593728 97 5
- SQLgt SELECT FROM vevent_name WHERE name
'latch free' - EVENT NAME PARAMETER1 PARAMETER2
PARAMETER3 - ------ ---------- --------------- ---------------
--------------- - 3 latch free address number
tries - SQLgt SELECT name FROM vlatch WHERE latch 97
- NAME
- --------------------
- cache buffers chains
8latch free in Oracle 10g
- SQLgt SELECT event, state
- 2 FROM vsession_wait
- 3 WHERE sid 162
- EVENT STATE
- ------------------------------ -------
- latch cache buffers chains WAITING
- The more descriptive wait event name saves us the
effort of decoding wait event parameters.
9enqueue
- Prior to Oracle 10g Could indicate a wait on any
of a few dozen different types of enqueues. - Oracle 10g 184 distinct wait events replace the
one generic enqueue wait event - Event names differentiate the enqueue type and
sometimes even the contention type. - Parameter names are more descriptive than generic
id1 and id2.
10enqueue Prior to Oracle 10g
- SQLgt SELECT event, state, seconds_in_wait FROM
vsession_wait WHERE sid 96 - EVENT STATE
SECONDS_IN_WAIT - -----------------------------------
------------------- --------------- - enqueue WAITING
24 - SQLgt SELECT sid, CHR (BITAND (p1,-16777216) /
16777215) - 2 CHR (BITAND (p1, 16711680) / 65535)
enq, - 3 DECODE (CHR (BITAND (p1,-16777216) /
16777215) - 4 CHR (BITAND (p1, 16711680) /
65535), - 5 'TX', 'Transaction (RBS)',
- ...
- 13 CHR (BITAND (p1, 16711680)
/ 65535)) enqueue_name, - 14 DECODE (BITAND (p1, 65535), 1,
'Null', 2, 'Sub-Share', - 15 3, 'Sub-Exclusive', 4,
'Share', 5, 'Share/Sub-Exclusive', - 16 6, 'Exclusive', 'Other')
lock_mode - 17 FROM vsession_wait WHERE sid 96
- SID ENQ ENQUEUE_NAME
LOCK_MODE
11enqueue in Oracle 10g
- SQLgt SELECT event, state, seconds_in_wait FROM
vsession_wait WHERE sid 143 - EVENT STATE
SECONDS_IN_WAIT - -----------------------------------
------------------- --------------- - enq TX - row lock contention WAITING
495 - Separate events for separate TX issues
- SQLgt SELECT name, parameter1, parameter2,
parameter3 - 2 FROM vevent_name
- 3 WHERE name LIKE 'enq TX'
- NAME PARAMETER1
PARAMETER2 PARAMETER3 - ------------------------------ -------------
--------------- ------------- - enq TX - contention namemode
usnltlt16 slot sequence - enq TX - row lock contention namemode
usnltlt16 slot sequence - enq TX - allocate ITL entry namemode
usnltlt16 slot sequence - enq TX - index contention namemode
usnltlt16 slot sequence
12enqueue in Oracle 10g
- More descriptive parameter names, too
- SQLgt SELECT name, parameter1, parameter2,
parameter3 - 2 FROM vevent_name
- 3 WHERE name IN ('enq HW - contention',
'enq SQ - contention') - NAME PARAMETER1
PARAMETER2 PARAMETER3 - ------------------------------ -------------
--------------- ------------- - enq HW - contention namemode
table space block - enq SQ - contention namemode
object 0
13Wait Event Classes
- Every wait event belongs to one of 12 classes.
- Classes can help point toward a root cause.
- Almost 70 of all wait events belong to a class
called Other. - Most of the wait events that occur frequently
belong to wait event classes with helpful names.
14Wait Event Class Names
15Wait Event Class Names
16Wait Class Assignments
- SQLgt SELECT wait_class, name
- 2 FROM vevent_name
- 3 WHERE name LIKE 'enq TX'
- 4 ORDER BY wait_class, name
- WAIT_CLASS NAME
- --------------- ----------------------------------
------ - Application enq TX - row lock contention
- Concurrency enq TX - index contention
- Configuration enq TX - allocate ITL entry
- Other enq TX - contention
17vevent_name
- Four new columns show which wait class a wait
event belongs to - SQLgt DESCRIBE vevent_name
- Name
Null? Type - -----------------------------------------
-------- ------------------- - EVENT
NUMBER - EVENT_ID
NUMBER - NAME
VARCHAR2(64) - PARAMETER1
VARCHAR2(64) - PARAMETER2
VARCHAR2(64) - PARAMETER3
VARCHAR2(64) - WAIT_CLASS_ID
NUMBER - WAIT_CLASS
NUMBER - WAIT_CLASS
VARCHAR2(64)
18vsql and vsqlarea
- Six new columns give more information about how
time was spent executing a SQL statement - application_wait_time
- concurrency_wait_time
- cluster_wait_time
- user_io_wait_time
- plsql_exec_time
- java_exec_time
- Times are in microseconds.
19vsqlarea Example
- In session 1
- SQLgt UPDATE testtab SET numcol numcol 1
WHERE ROWNUM lt 1000 - In session 2
- SQLgt UPDATE testtab SET numcol numcol 1
WHERE ROWNUM lt 1000 - In session 1
- SQLgt ROLLBACK
- In session 2
- SQLgt ROLLBACK
- In session 3
- SQLgt UPDATE testtab SET numcol numcol 1
20vsqlarea Example
- SQLgt SELECT sql_id, application_wait_time appl,
- 2 concurrency_wait_time concurr,
user_io_wait_time user_io - 3 FROM vsqlarea
- 4 WHERE sql_text LIKE 'UPDATE testtab SET
numcol' - SQL_ID APPL CONCURR USER_IO
- ------------- --------- --------- -----------
- 038m56cp4am0c 178500000 0 20000
- fd5mxhdbf09ny 0 10000 105040000
- SQLgt SELECT sql_id, sql_text
- 2 FROM vsqlarea
- 3 WHERE sql_id IN ('fd5mxhdbf09ny','038m56cp4a
m0c') - SQL_ID SQL_TEXT
- ------------- ------------------------------------
----------------------- - 038m56cp4am0c UPDATE testtab SET numcol numcol
1 WHERE ROWNUM lt 1000 - fd5mxhdbf09ny UPDATE testtab SET numcol numcol
1
21vsession_wait_history
- New view in Oracle 10g.
- Similar to vsession_wait, but shows the last ten
wait events for each session. - The seq column is supposed to show the order in
which the waits occurred, with 1 being the most
recent wait - Different from seq in vsession.
- Does not appear to work as documented (on our
10.1.0.3 system on Solaris).
22vsession_wait_history
- SQLgt DESCRIBE vsession_wait_history
- Name Null?
Type - -----------------------------------------
-------- -------------------------- - SID
NUMBER - SEQ
NUMBER - EVENT
NUMBER - EVENT
VARCHAR2(64) - P1TEXT
VARCHAR2(64) - P1
NUMBER - P2TEXT
VARCHAR2(64) - P2
NUMBER - P3TEXT
VARCHAR2(64) - P3
NUMBER - WAIT_TIME
NUMBER - WAIT_COUNT
NUMBER
23vsession_wait_history Example
- SQLgt SELECT sid, seq, event, wait_time, p1,
p2, p3 - 2 FROM vsession_wait_history
- 3 WHERE sid 154
- 4 ORDER BY seq
- SID SEQ EVENT WAIT_TIME
P1 P2 P3 - --- ---- ------------------------ ----------
------ ------ ------ - 154 1 db file sequential read 28
4 3547 1 - 154 2 log buffer space 18
0 0 0 - 154 3 log buffer space 36
0 0 0 - 154 4 db file sequential read 0
4 3559 1 - 154 5 db file sequential read 0
4 1272 1 - 154 6 db file sequential read 0
4 3555 1 - 154 7 log buffer space 9
0 0 0 - 154 8 db file sequential read 0
4 3551 1 - 154 9 db file sequential read 6
4 1268 1 - 154 10 log buffer space 8
0 0 0
24vsession
- All columns from vsession_wait have been added
to vsession - Saves us the effort of joining the two views..
- New blocking_session, blocking_session_status
columns - blocking_session shows the SID of the session
holding the resource blocking this session. - blocking_session_status contains VALID when
blocking_session is populated.
25vsession Example
- Prior to Oracle 10g
- SQLgt SELECT s.sid, w.state, w.event,
w.seconds_in_wait siw, - 2 s.sql_address, s.sql_hash_value
hash_value, w.p1, w.p2, w.p3 - 3 FROM vsession s, vsession_wait w
- 4 WHERE s.sid w.sid
- 5 AND s.sid 154
- Oracle 10g
- SQLgt SELECT sid, state, event,
seconds_in_wait siw, - 2 sql_address, sql_hash_value
hash_value, p1, p2, p3 - 3 FROM vsession
- 4 WHERE sid 154
26Another Example
- Why is session 154 waiting? And who is blocking
session 154? - SQLgt SELECT sid, blocking_session,
blocking_session_status block_status, - 2 username, event, seconds_in_wait
siw - 3 FROM vsession
- 4 WHERE sid 154
- BLOCKING
- SID _SESSION BLOCK_STATUS USERNAME EVENT
SIW - --- -------- ------------ --------
------------------------------ --- - 154 157 VALID TSUTTON enq TX -
row lock contention 318
27vevent_histogram
- New view in Oracle 10g.
- Shows instance-wide summary wait event statistics
like vsystem_event, but provides a wait time
histogram for each. Buckets - Less than 1 mS.
- 1 mS to 2 mS.
- 2 mS to 4 mS.
- 4 mS to 8 mS.
- ... and so on
28vevent_histogram
- SQLgt DESCRIBE vevent_histogram
- Name Null?
Type - -----------------------------------------
-------- --------------------------- - EVENT
NUMBER - EVENT
VARCHAR2(64) - WAIT_TIME_MILLI
NUMBER - WAIT_COUNT
NUMBER
29vevent_histogram Example
- How significant is the row lock contention on our
system? - SQLgt SELECT event, total_waits, time_waited,
average_wait - 2 FROM vsystem_event
- 3 WHERE event 'enq TX - row lock
contention' - EVENT TOTAL_WAITS
TIME_WAITED AVERAGE_WAIT - ----------------------------- -----------
----------- ------------ - enq TX - row lock contention 17218
2101966 122 - Does the average wait of 1.22 seconds indicated
by vsystem_event paint an accurate picture?
30vevent_histogram Example
- SQLgt SELECT event, wait_time_milli, wait_count
- 2 FROM vevent_histogram
- 3 WHERE event 'enq TX - row lock
contention' - EVENT WAIT_TIME_MILLI
WAIT_COUNT - ----------------------------- ---------------
---------- - enq TX - row lock contention 1
833 - enq TX - row lock contention 2
635 - enq TX - row lock contention 4
372 - enq TX - row lock contention 8
395 - enq TX - row lock contention 16
781 - enq TX - row lock contention 32
3729 - enq TX - row lock contention 64
3050 - enq TX - row lock contention 128
410 - enq TX - row lock contention 256
47 - enq TX - row lock contention 512
46 - enq TX - row lock contention 1024
37 - enq TX - row lock contention 2048
3 - enq TX - row lock contention 4096
6880
31vsystem_wait_class and vsession_wait_class
- New views in Oracle 10g.
- Show wait counts and total time waited since
instance startup and session start. - Similar to vsystem_event and vsession_event,
but summarized by wait class. - Times are in centiseconds.
32vsystem_wait_class and vsession_wait_class
- SQLgt DESCRIBE vsystem_wait_class
- Name Null?
Type - -----------------------------------------
-------- --------------------------- - WAIT_CLASS_ID
NUMBER - WAIT_CLASS
NUMBER - WAIT_CLASS
VARCHAR2(64) - TOTAL_WAITS
NUMBER - TIME_WAITED
NUMBER - SQLgt DESCRIBE vsession_wait_class
- Name Null?
Type - -----------------------------------------
-------- --------------------------- - SID
NUMBER - SERIAL
NUMBER - WAIT_CLASS_ID
NUMBER - WAIT_CLASS
NUMBER - WAIT_CLASS
VARCHAR2(64) - TOTAL_WAITS
NUMBER - TIME_WAITED
NUMBER
33vsystem_wait_class Example
- SQLgt SELECT wait_class, time_waited
- 2 FROM vsystem_wait_class
- 3 ORDER BY time_waited DESC
- WAIT_CLASS TIME_WAITED
- ------------- -----------
- Idle 777450022
- System I/O 1261584
- User I/O 116667
- Configuration 116481
- Application 72301
- Other 12432
- Commit 3496
- Concurrency 319
- Network 1
34Active Session History
- New MMNL background process samples vsession
once each second. - Data captured on active sessions is available in
vactive_session_history, usually for 1-4 hours. - Automatic Workload Repository captures one out of
every ten samples in its hourly snapshots.
35Active Session History
- SQLgt DESCRIBE vactive_session_history
- Name Null?
Type - -----------------------------------------
-------- --------------------------- - SAMPLE_ID
NUMBER - SAMPLE_TIME
TIMESTAMP(3) - SESSION_ID
NUMBER - SESSION_SERIAL
NUMBER - USER_ID
NUMBER - SQL_ID
VARCHAR2(13) - SQL_CHILD_NUMBER
NUMBER - SQL_PLAN_HASH_VALUE
NUMBER - SQL_OPCODE
NUMBER - SERVICE_HASH
NUMBER - SESSION_TYPE
VARCHAR2(10) - SESSION_STATE
VARCHAR2(7) - QC_SESSION_ID
NUMBER - QC_INSTANCE_ID
NUMBER - EVENT
VARCHAR2(64) - EVENT_ID
NUMBER
36Active Session History
- vactive_session_history shows detailed wait
information, current SQL statement,
object/file/block information, and more. - When a wait that was sampled by ASH completes,
Oracle fills in the time_waited column in the
vactive_session_history row with the actual
duration of the wait.
37ASH is Always On
- You may not have to turn on tracing or begin
monitoring v views when users report a problem,
because ASH is already sampling data. - In some cases you may be able to diagnose and
resolve a problem on first detection, even if you
learn of the problem after the fact. - You may not need to get users to reproduce the
problem.
38Sampling versus Collecting
- ASH samples vsession once each second. Very
different from extended SQL trace, which collects
data on every wait and every OCI call. - A session could encounter hundreds of waits in
one second, and ASH will only capture data for
one of them. - Use ASH to view aggregate data on many sessions
over a period of time. - Dont use ASH to count waits, get maximum wait
times, or look at a short time period.
39ASH Example
- SQLgt SELECT DECODE (session_state, 'WAITING',
event, NULL) event, - 2 session_state, COUNT(), SUM
(time_waited) time_waited - 3 FROM vactive_session_history
- 4 WHERE module 'ARXENV'
- 5 AND sample_time gt SYSDATE - (2/24)
- 6 GROUP BY DECODE (session_state, 'WAITING',
event, NULL), - 7 session_state
- EVENT SESSION_STATE
COUNT() TIME_WAITED - ------------------------------ -------------
-------- ----------- - ON CPU
124 0 - log file sync WAITING
2 52686 - db file scattered read WAITING
2 28254 - db file sequential read WAITING
1 6059 - control file sequential read WAITING
1 9206 - SQLNet break/reset to client WAITING
1 9140 - enq TX - row lock contention WAITING
922 930864016
40Automatic Workload Repository
- Conceptually similar to Statspack.
- Collects snapshots of system-wide performance
statistics, plus ASHs sampling of session
activity. - You can generate activity reports using
awrrpt.sql or Enterprise Manager interface. - Out of the box, Oracle 10g databases collect
snapshots hourly and retain data for seven days.
41AWR Management
- Snapshot data is stored in SYS-owned tables in
the SYSAUX tablespace. - Use dbms_workload_repository to
- Collect a snapshot on demand.
- Purge snapshots.
- Adjust snapshot interval.
- Adjust snapshot retention period.
- Disable AWR snapshot collection.
42AWR versus Statspack
- AWR benefits
- More tightly integrated into Oracle kernel,
reducing snapshot collection overhead. - Snapshots include sampling of ASH data.
- Data collected by AWR is accessible via views
with names starting DBA_HIST. - DBA_HIST views are documented.
- Statspack has been updated to be 10g aware.
43Time Model Statistics
- New concept in Oracle 10g.
- Two new views provide a more detailed picture of
how Oracle spends time - Separates out background and user processes.
- Provides data not previously available, such as
how much time was spent in PL/SQL execution. - Times are in microseconds.
44Time Model Statistics
- SQLgt DESCRIBE vsys_time_model
- Name Null?
Type - ----------------------------------------
-------- --------------------------- - STAT_ID
NUMBER - STAT_NAME
VARCHAR2(64) - VALUE
NUMBER - SQLgt DESCRIBE vsess_time_model
- Name Null?
Type - ----------------------------------------
-------- --------------------------- - SID
NUMBER - STAT_ID
NUMBER - STAT_NAME
VARCHAR2(64) - VALUE
NUMBER
45Time Model Statistics
- Some important notes about these statistics
- Statistics do not include background processes
unless background appears in the statistic
name. - DB time shows elapsed time spent in Oracle
calls. (Basically CPU time plus non-idle waits.)
46Time Model Statistics Example
- SQLgt SELECT stat_name, value / 1000000 seconds
FROM vsys_time_model - 2 ORDER BY seconds DESC
- STAT_NAME
SECONDS - ------------------------------------------------
---------- - DB time
80970.190 - sql execute elapsed time
75057.271 - DB CPU
44448.628 - background elapsed time
29333.160 - PL/SQL execution elapsed time
8824.538 - background cpu time
5170.311 - parse time elapsed
1270.147 - hard parse elapsed time
838.068 - PL/SQL compilation elapsed time
176.731 - sequence load elapsed time
112.334 - connection management call elapsed time
44.644 - failed parse elapsed time
11.946 - hard parse (sharing criteria) elapsed time
5.579 - hard parse (bind mismatch) elapsed time
4.610
47Tracing Improvements
- Enabling extended SQL trace in another session is
now more convenient. - Tracing sessions in a connection pooling or
shared server environment is no longer
impractical. - New dbms_monitor package offers these two
benefits and more.
48Tracing Prior to Oracle 10g
- Tracing sessions in Oracle 9i and earlier had
annoyances - dbms_support usually missing or not installed.
- dbms_system.set_ev not officially supported.
- ALTER SESSION SET EVENTS to set 10046 event has a
syntax hard (for some of us) to remember.
49Easier Tracing in Oracle 10g
- Control tracing of your own session
- EXECUTE dbms_monitor.session_trace_enable
(waitsgtTRUE, bindsgtTRUE) - EXECUTE dbms_monitor.session_trace_disable
() - Control tracing of another session
- EXECUTE dbms_monitor.session_trace_enable
(session_idgt153, waitsgtTRUE) - EXECUTE dbms_monitor.session_trace_disable
(session_idgt153) - Tracing sessions in Oracle 10g is easier because
dbms_monitor is provided and installed in every
Oracle 10g database by default.
50Tracing Prior to Oracle 10g
- Straightforward if session being traced uses
dedicated server connection. - Tracing session using shared server architecture
leads to multiple trace files that have to be
merged manually. - Tracing an end-user session that does not map to
one Oracle session (eg connection pooling or
multiplexing) is not practical.
51New Tracing Features in 10g
- Tracing can be enabled for sessions with a
specific client identifier - EXECUTE dbms_session.set_identifier ('client
identifier') - EXECUTE dbms_session.clear_identifier ()
- Tracing can be enabled for sessions with specific
service / module / action combination - EXECUTE dbms_application_info.set_module
('module name', 'action name') - EXECUTE dbms_application_info.set_action
('action name') - Trace data split over multiple trace files can be
merged into one trace file for TKPROF processing - trcsess output clientid service
module action session
52Connection Pooling Example
- Application server connection pooling code
- EXECUTE dbms_session.set_identifier ('session_id
from application table') - ...do the work for this end user session...
- EXECUTE dbms_session.clear_identifier ()
- Trace the end-user session assigned session_id
12345 in the applications sessions table - SQLgt EXECUTE dbms_monitor.client_id_trace_enable
- - gt (client_idgt'12345', waitsgtTRUE,
bindsgtTRUE) - Consolidate trace data into one trace file
suitable for use by TKPROF - cd ORACLE_BASE/admin/ORACLE_SID/udump
- trcsess outputmytracefile.trc clientid12345
53Twelve Oracle 10g Enhancements
- More descriptive wait event names
- Wait event classes
- vevent_name new columns
- vsql / vsqlarea new columns
- vsession_wait_history
- vsession new columns
- vevent_histogram
- vsystem_wait_class / vsession_wait_class
- Active Session History (ASH)
- Automatic Workload Repository (AWR)
- Time model statistics
- Improved session tracing
54Wrapping Up
- Oracle 10g includes many enhancements to the wait
event interface that should make performance
management using wait event methodologies easier
than ever. - Some are just conveniences
- More descriptive event names, wait event classes,
dbms_monitor.session_trace_enable... - Some provide data previously unavailable
- New vsql columns, time model statistics,
vevent_histogram...
55White Paper
- Contains additional detail we didnt have time to
cover today. - Includes a handy reference list of all Oracle 10g
wait events, wait classes, and wait event
parameters. - Download www.dbspecialists.com/presentations
56Contact Information
- Terry Sutton and Roger Schrag
- Database Specialists, Inc.
- 388 Market Street, Suite 400
- San Francisco, CA 94111
- Tel 415/344-0500
- Toll-free 888/648-0500
- www.dbspecialists.com
- tsutton_at_dbspecialists.com
- rschrag_at_dbspecialists.com