1 interpreting wait events to boost system performance roger schrag database specialists, inc

68
1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc. www.dbspecialists.com

Upload: charla-page

Post on 17-Dec-2015

215 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

1

Interpreting Wait Events To Boost System Performance

Roger SchragDatabase Specialists,

Inc.www.dbspecialists.com

Page 2: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

2

Session Objectives

Define wait events Discuss how to use the wait event interface Walk through four examples of how wait

event information was used to troubleshoot production problems

Page 3: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

3

“Wait Event” Defined We say an Oracle process is “busy” when it wants

CPU time. When an Oracle process is not busy, it is waiting

for something to happen. There are only so many things an Oracle process

could be waiting for, and the kernel developers at Oracle have attached names to them all.

These are wait events.

Page 4: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

4

Wait Event Examples An Oracle process waiting for the client

application to submit a SQL statement waits on a “SQL*Net message from client” event.

An Oracle process waiting on another session to release a row-level lock waits on an “enqueue” event.

Page 5: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

5

Wait Event Interface Each Oracle process identifies the event it is

waiting for each time a wait begins. The instance collects cumulative statistics

about events waited upon since instance startup.

You can access this information through v$ views and tracing events.

These make up the wait event interface.

Page 6: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

6

Viewing Wait Events

http://dbrx.dbspecialists.com/pls/dbrx/view_report

Page 7: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

7

Why Wait Event Information

Is Useful Wait events touch all areas of Oracle—from I/O to latches to parallelism to network traffic.

Wait event data can be remarkably detailed. “Waited 0.02 seconds to read 8 blocks from file 42 starting at block 18042.”

Analyzing wait event data will yield a path toward a solution for almost any problem.

Page 8: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

8

Important Wait Events There were 102 wait events in Oracle 7.3. There are 217 wait events in Oracle 8i Release 3

(8.1.7). Most come up infrequently or are rarely significant

for troubleshooting performance. Different wait events are significant in different

environments, depending on which Oracle features have been deployed.

Page 9: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

9

A Few Common Wait Eventsenqueue log file sequential read

library cache pin log file parallel write

library cache load lock log file sync

latch free db file scattered read

buffer busy waits db file sequential read

control file sequential read db file parallel read

control file parallel write db file parallel write

log buffer space direct path read / write

Page 10: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

10

Idle Events

Sometimes an Oracle process is not busy simply because it has nothing to do.

In this case the process will be waiting on an event that we call an “idle event.”

Idle events are usually not interesting from the tuning and troubleshooting perspective.

Page 11: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

11

Common Idle Eventsclient message parallel query dequeue

dispatcher timer rdbms ipc message

Null event SQL*Net message from client

smon timer SQL*Net message to client

PX Idle Wait SQL*Net more data from client

pipe get wakeup time manager

PL/SQL lock timer virtual circuit status

pmon timer lock manager wait for remote message

Page 12: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

12

Accounted For By The Wait Event Interface

Time spent waiting for something to do (idle events)

Time spent waiting for something to happen so that work may continue (non-idle events)

Page 13: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

13

Not Accounted For By The Wait Event Interface

Time spent using a CPU Time spent waiting for a CPU Time spent waiting for virtual memory to be

swapped back into physical memory

Note that logical reads from the buffer cache do not appear in the wait event interface.

Page 14: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

14

Timed StatisticsThe wait event interface will not collect timing information unless timed statistics are enabled.

Enable timed statistics dynamically at the instance or session level:ALTER SYSTEM SET timed_statistics = TRUE;

ALTER SESSION SET timed_statistics = TRUE;

Enable timed statistics at instance startup by setting the instance parameter:timed_statistics = true

Page 15: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

15

The Wait Event Interface

Dynamic performance views– v$system_event– v$session_event– v$event_name– v$session_wait

System event 10046

Page 16: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

16

The v$system_event ViewShows one row for each wait event name, along with cumulative statistics since instance startup. Wait events that have not occurred at least once since instance startup do not appear in this view.

Column Name Data Type-------------------------- ------------EVENT VARCHAR2(64)TOTAL_WAITS NUMBERTOTAL_TIMEOUTS NUMBERTIME_WAITED NUMBERAVERAGE_WAIT NUMBER

Page 17: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

17

Columns In v$system_event EVENT: The name of a wait event TOTAL_WAITS: Total number of times a process

has waited for this event since instance startup TOTAL_TIMEOUTS: Total number of timeouts while

waiting for this event since instance startup TIME_WAITED: Total time waited for this wait event

by all processes since instance startup (in centiseconds)

AVERAGE_WAIT: The average length of a wait for this event since instance startup (in centiseconds)

Page 18: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

18

Sample v$system_event Query

SQL> SELECT event, time_waited 2 FROM v$system_event 3 WHERE event IN ('smon timer', 4 'SQL*Net message from client', 5 'db file sequential read', 6 'log file parallel write');

EVENT TIME_WAITED--------------------------------- -----------log file parallel write 159692db file sequential read 28657smon timer 130673837SQL*Net message from client 16528989

Page 19: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

19

The v$session_event ViewShows one row for each wait event name within each session, along with cumulative statistics since session start.

Column Name Data Type-------------------------- ------------SID NUMBEREVENT VARCHAR2(64)TOTAL_WAITS NUMBERTOTAL_TIMEOUTS NUMBERTIME_WAITED NUMBERAVERAGE_WAIT NUMBERMAX_WAIT NUMBER

Page 20: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

20

Columns In v$session_event SID: The ID of a session (from v$session) EVENT: The name of a wait event TOTAL_WAITS: Total number of times this session has waited

for this event TOTAL_TIMEOUTS: Total number of timeouts while this

session has waited for this event TIME_WAITED: Total time waited for this event by this session

(in centiseconds) AVERAGE_WAIT: The average length of a wait for this event

in this session (in centiseconds) MAX_WAIT: The maximum amount of time the session had to

wait for this event (in centiseconds)

Page 21: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

21

Sample v$session_event Query

SQL> SELECT event, total_waits, time_waited 2 FROM v$session_event 3 WHERE SID = 4 (SELECT sid FROM v$session 5 WHERE audsid = 6 USERENV ('sessionid') ); EVENT WAITS TIME_WAITED--------------------------- ----- ----------- db file sequential read 552 240db file scattered read 41 31SQL*Net message to client 73 0SQL*Net message from client 72 339738

Page 22: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

22

The v$event_name View

Shows one row for each wait event name known to the Oracle kernel, along with names of up to three parameters associated with the wait event.

Column Name Data Type-------------------------- ------------EVENT# NUMBERNAME VARCHAR2(64)PARAMETER1 VARCHAR2(64)PARAMETER2 VARCHAR2(64)PARAMETER3 VARCHAR2(64)

Page 23: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

23

Columns In v$event_name

EVENT#: An internal ID NAME: The name of a wait event PARAMETERn: The name of a parameter

associated with the wait event

Page 24: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

24

Sample v$event_name Query

SQL> SELECT *

2 FROM v$event_name

3 WHERE name = 'db file scattered read';

 

EVENT# NAME

---------- ------------------------------

PARAMETER1 PARAMETER2 PARAMETER3

------------- ------------- -------------

95 db file scattered read

file# block# blocks

Page 25: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

25

The v$session_wait ViewShows one row for each session, providing detailed information about the current or most recent wait event.

Column Name Data Type-------------------------- ------------SID NUMBERSEQ# NUMBEREVENT VARCHAR2(64)P1TEXT VARCHAR2(64)P1 NUMBERP1RAW RAW(4)P2TEXT VARCHAR2(64)P2 NUMBERP2RAW RAW(4)P3TEXT VARCHAR2(64)P3 NUMBERP3RAW RAW(4)WAIT_TIME NUMBERSECONDS_IN_WAIT NUMBERSTATE VARCHAR2(19)

Page 26: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

26

Columns In v$session_wait SID: The ID of a session SEQ#: A number that increments by one on each

new wait STATE: An indicator of the session status:

– ‘WAITING’: The session is currently waiting, and details of the wait event are provided.

– ‘WAITED KNOWN TIME’: The session is not waiting, but information about the most recent wait is provided.

– ‘WAITED SHORT TIME’ or ‘WAITED UNKNOWN TIME’: The session is not waiting, but partial information about the most recent wait is provided.

Page 27: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

27

Columns In v$session_wait (continued)

EVENT: The name of a wait event PnTEXT: The name of a parameter associated with the

wait event Pn: The value of the parameter in decimal form PnRAW: The value of the parameter in raw form WAIT_TIME: Length of most recent wait (in centiseconds)

if STATE = ‘WAITED KNOWN TIME’ SECONDS_IN_WAIT: How long current wait has been so

far if STATE = ‘WAITING’

Page 28: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

28

Sample v$session_wait Query

SQL> SELECT * FROM v$session_wait WHERE sid = 16;  SID SEQ# EVENT---- ----- ------------------------------P1TEXT P1 P1RAW P2TEXT P2 P2RAW------ ---- -------- ------ ---- --------P3TEXT P3 P3RAW WAIT_TIME SECONDS_IN_WAIT------ ---- -------- --------- ---------------STATE------------------- 16 303 db file scattered readfile# 17 00000011 block# 2721 00000AA1blocks 8 00000008 -1 0WAITED SHORT TIME

Page 29: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

29

System Event 10046

Methods for setting system events: “event” instance parameter dbms_system.set_ev oradebug ALTER SESSION SET events

Setting event 10046 enables SQL trace, and can optionally include wait event information and bind variable data in trace files as well.

Page 30: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

30

System Event 10046 Settings

ALTER SESSION SET events

'10046 trace name context forever, level N’;

Value of N Effect

1 Enables ordinary SQL trace

4 Enables SQL trace with bind variable values included in trace file

8 Enables SQL trace with wait event information included in trace file

12 Equivalent of level 4 and level 8 together

Page 31: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

31

Sample Trace Output=====================PARSING IN CURSOR #1 len=80 dep=0 uid=502 oct=3 lid=502 tim=2293771931 hv=2293373707 ad='511dca20'SELECT /*+ FULL */ SUM (LENGTH(notes))FROM customer_callsWHERE status = :xEND OF STMTPARSE #1:c=0,e=0,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=0,tim=2293771931BINDS #1: bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=03 oacfl2=0 size=24 offset=0 bfp=09717724 bln=22 avl=02 flg=05 value=43EXEC #1:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=2293771931WAIT #1: nam='SQL*Net message to client' ela= 0 p1=675562835 p2=1 p3=0WAIT #1: nam='db file scattered read' ela= 3 p1=17 p2=923 p3=8WAIT #1: nam='db file scattered read' ela= 1 p1=17 p2=931 p3=8WAIT #1: nam='db file scattered read' ela= 2 p1=17 p2=939 p3=8WAIT #1: nam='db file sequential read' ela= 0 p1=17 p2=947 p3=1WAIT #1: nam='db file scattered read' ela= 3 p1=17 p2=1657 p3=8

Page 32: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

32

Using Wait Event Information

Four examples of how wait event information was used to diagnose production problems

Page 33: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

33

Example #1: A Slow Web Page

A dynamic web page took several seconds to come up. Developers tracked the bottleneck down to one query. The execution plan showed that the query was using an index, so the developers thought there might be a “database problem.”

Page 34: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

34

The Slow QuerySELECT COUNT (*)

FROM customer_inquiries

WHERE status_code = :b1

AND status_date > :b2;

 

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (AGGREGATE)

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'CUSTOMER_INQUIRIES'

3 2 INDEX (RANGE SCAN) OF 'CUSTOMER_INQUIRIES_N2' (NON-UNIQUE)

The CUSTOMER_INQUIRIES_N2 index was a concatenated index with status_code as its first column. The status_date column was not indexed.

Page 35: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

35

Wait Events For One User’s Session

A query against v$session_event after the query ran in isolation yielded:

TOTAL TIMEEVENT WAITS WAITED------------------------------ ----- ------db file scattered read 15 3db file sequential read 6209 140latch free 2 1SQL*Net message to client 8 0SQL*Net message from client 7 21285

Page 36: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

36

The Path To Problem Resolution

What we learned from wait event information:– The query performed a large number of index

lookups. – 1.40 seconds were spent waiting on the index

lookups, plus any CPU overhead. Areas to research further:

– Was the database server CPU starved? – Was the index lookup selective? – Idea: Modify the query to use a full table scan

instead of the index.

Page 37: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

37

Research Results The database server was CPU starved. The run

queue length often exceeded twice the number of CPUs on the server.

Using just the status_code column of the CUSTOMER_INQUIRIES_N2 index made for a very unselective index lookup. Over 90% of the rows in the table had a status code of 12.

A full table scan against CUSTOMER_INQUIRIES appeared to run faster than using the index.

Page 38: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

38

Problem Resolution

A query against v$session_event after the modified query ran in isolation yielded:  TOTAL TIMEEVENT WAITS WAITED------------------------------ ----- ------db file scattered read 460 13db file sequential read 3 1latch free 1 0SQL*Net message to client 10 0SQL*Net message from client 9 18317

Page 39: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

39

Analyzing The Results The rule of thumb that a full table scan is better

than a scan of an unselective index is true. I/O systems can perform a few multi-block I/O

requests much faster than many single-block I/O requests.

Physical reads require a small amount of CPU time. Lack of available CPU can make an I/O intensive statement run even slower, although the wait event interface will not show this.

Page 40: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

40

Example #2: Slow Batch Processing

An additional data feed program was added to the nightly batch processing job queue, and the overnight processing no longer finished before the morning deadline. More CPUs were added to the database server, but this did not improve processing speed significantly.

Page 41: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

41

Summarizing Wait Events During A Period Of Time v$system_event shows wait event totals since

instance startup. v$session_event shows wait event totals since

the beginning of a session. You can capture view contents at different points

in time and compute the delta in order to get wait event information for a specific period of time.

Statspack and many third-party tools can do this for you.

Page 42: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

42

Simple Script To See Wait Events During A 30 Second

Time PeriodCREATE TABLE previous_events ASSELECT SYSDATE timestamp, v$system_event.*FROM v$system_event; EXECUTE dbms_lock.sleep (30); SELECT A.event, A.total_waits - NVL (B.total_waits, 0) total_waits, A.time_waited - NVL (B.time_waited, 0) time_waitedFROM v$system_event A, previous_events BWHERE B.event (+) = A.eventORDER BY A.event;

Page 43: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

43

Wait Events During 30 Seconds Of Batch

ProcessingEVENT TOTAL_WAITS TIME_WAITED------------------------------ ----------- -----------LGWR wait for redo copy 115 41buffer busy waits 53 26control file parallel write 45 44db file scattered read 932 107db file sequential read 76089 6726direct path read 211 19direct path write 212 15enqueue 37 5646free buffer waits 11 711latch free 52 44log buffer space 2 8log file parallel write 4388 1047log file sequential read 153 91log file single write 2 6log file switch completion 2 24write complete waits 6 517

Page 44: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

44

The Path To Problem Resolution

What we learned from wait event information:– There appeared to be significant lock contention. – In 30 seconds of elapsed time, sessions spent over 56

seconds waiting for locks. Areas to research further:

– What type of locks are being waited on? Row-level locks? Table-level locks? Others?

– If the locks are table-level or row-level, then which database tables are experiencing contention? Which SQL statements are causing the contention?

Page 45: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

45

Tracing Waits In A Session

The following commands were used to enable wait event tracing in the process with Oracle PID 13: 

SQL> oradebug setorapid 13

Unix process pid: 19751,

image: [email protected] (TNS V1-V3)

SQL> oradebug session_event –

> 10046 trace name context forever, level 8

Statement processed.

SQL>

Page 46: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

46

Trace File ContentsEXEC #5:c=0,e=0,p=3,cr=2,cu=1,mis=0,r=1,dep=1,og=4,tim=2313020980XCTEND rlbk=0, rd_only=0WAIT #1: nam='write complete waits' ela= 11 p1=3 p2=2 p3=0WAIT #4: nam='db file sequential read' ela= 4 p1=10 p2=12815 p3=1WAIT #4: nam='db file sequential read' ela= 1 p1=10 p2=12865 p3=1WAIT #4: nam='db file sequential read' ela= 5 p1=3 p2=858 p3=1=====================PARSING IN CURSOR #4 len=65 dep=1 uid=502 oct=6 lid=502tim=2313021001 hv=417623354 ad='55855844'UPDATE CUSTOMER_CALLS SET ATTR_3 = :b1 WHERE CUSTOMER_CALL_ID=:b2END OF STMTEXEC #4:c=1,e=10,p=3,cr=2,cu=3,mis=0,r=1,dep=1,og=4,tim=2313021001WAIT #4: nam='db file sequential read' ela= 0 p1=10 p2=5789 p3=1WAIT #4: nam='enqueue' ela= 307 p1=1415053318 p2=196705 p3=6744WAIT #4: nam='enqueue' ela= 307 p1=1415053318 p2=196705 p3=6744WAIT #4: nam='enqueue' ela= 53 p1=1415053318 p2=196705 p3=6744WAIT #4: nam='db file sequential read' ela= 0 p1=10 p2=586 p3=1WAIT #4: nam='db file sequential read' ela= 1 p1=3 p2=858 p3=1EXEC #4:c=0,e=668,p=3,cr=5,cu=3,mis=0,r=1,dep=1,og=4,tim=2313021669

Page 47: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

47

Understanding The enqueue Wait Event

SQL> SELECT parameter1,parameter2,parameter3 2 FROM v$event_name 3 WHERE name = 'enqueue'; PARAMETER1 PARAMETER2 PARAMETER3------------ ------------ ------------name|mode id1 id2 SQL> SELECT CHR (1415053318/65536/256) || 2 CHR (MOD (1415053318/65536, 256)), 3 MOD (1415053318, 65536) lock_mode 4 FROM SYS.dual; CH LOCK_MODE-- ----------TX 6

Page 48: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

48

Analyzing The Results Contention for exclusive locks on rows in the

customer_calls table was responsible for substantial delays in processing.

Looking at the row_wait_obj# and row_wait_row# columns in v$session would have identified the exact rows undergoing contention.

Page 49: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

49

Problem Resolution

Multiple programs were attempting to update the same rows in tables at the same time. Contention could be reduced by doing one or more of the following:– Running conflicting programs separately– Reducing lock scope– Reducing lock duration

Page 50: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

50

Example #3: A Slow Client/Server ApplicationA client/server application was taking several seconds to bring up a certain screen. The delay was occurring during startup before the user had a chance to kick off a query. The only thing happening in the form on startup was some fetching of basic reference data. All of the SQL had been tuned and was known to run very quickly.

Page 51: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

51

Manipulating timed_statistics

The timed_statistics parameter can be changed at any time at the session level with the following commands: ALTER SESSION SET timed_statistics = TRUE;ALTER SESSION SET timed_statistics = FALSE;

 Manipulate timed_statistics to collect wait event times during certain specific points of processing for debugging purposes.

Page 52: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

52

Wait Events During Form Startup

Modifying the form to disable timed_statistics at the end of the form startup logic yielded the following information in v$session_event:

TOTAL TIMEEVENT WAITS WAITED------------------------------ ----- ------SQL*Net message to client 18520 6SQL*Net message from client 18519 1064

 

v$sesstat showed the following: 

NAME VALUE------------------------------ ----------session logical reads 9295CPU used by this session 82physical reads 0

Page 53: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

53

The Path To Problem Resolution

What we learned from wait event information:– There were over 18,000 network roundtrips during form startup,

almost exactly two for every logical read.– The Oracle process spent over 10 seconds waiting for activity

from the client. Since timed statistics were disabled at the end of the form startup logic, this does not include time spent waiting on the end user.

Areas to research further:– How many rows of data does the form read from the database

during the startup phase?– Does the form really need to fetch all of this data? – Is the form fetching one row at a time or is it using Oracle’s array

processing interface?

Page 54: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

54

Research Results

The form was fetching 9245 rows of reference data during startup.

All of this data was necessary; none could be eliminated.

All data was fetched one row at a time.

Page 55: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

55

Problem ResolutionThe startup logic of the form was modified to fetch 100 rows at a time. This yielded the following information in v$session_event:  TOTAL TIMEEVENT WAITS WAITED------------------------------ ----- ------SQL*Net message to client 200 0SQL*Net message from client 199 28 

v$sesstat showed the following: NAME VALUE------------------------------ ----------session logical reads 135CPU used by this session 3physical reads 0

Page 56: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

56

Analyzing The Results Fetching rows 100 at a time instead of one at a

time dramatically reduced network roundtrips. Reducing network roundtrips reduced time spent

waiting on the network. Fetching rows 100 at a time also significantly

reduced the number of logical reads, and therefore the amount of CPU time required.

Page 57: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

57

Example #4: A Floundering Database Server

The DBA group discovered that one of the database servers was completely overwhelmed. Connecting to the database took a few seconds, selecting from SYS.dual took more than a second. Everything on the system ran very slowly.

Page 58: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

58

Longest Waits In v$system_event

EVENT TIME_WAITED------------------------------ ----------------log file sync 326284write complete waits 402284control file parallel write 501697db file scattered read 612671db file sequential read 2459961pmon timer 31839833smon timer 31974216db file parallel write 1353916234rdbms ipc message 6579264389latch free 8161581692SQL*Net message from client 15517359160

Page 59: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

59

The Path To Problem Resolution

What we learned from wait event information:– Most of the waits involved idle events or I/O events.– A large amount of time was spent waiting on latches.

Areas to research further:– How long has the instance been up?– Which latches are experiencing contention?

Page 60: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

60

Research Results The instance had been up for about seven days. The latch contention was in the shared pool and library cache,

as evidenced by a query against v$latch_misses:PARENT_NAME SUM(LONGHOLD_COUNT)------------------------------ -------------------enqueue hash chains 614enqueues 637Checkpoint queue latch 790session allocation 1131messages 1328session idle bit 2106latch wait list 5977modify parameter values 6242cache buffers chains 9876row cache objects 38899cache buffers lru chain 125352shared pool 4041451library cache 4423229

Page 61: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

61

Further Research Results The shared pool was 400 Mb in size. There were over 36,000 statements in the shared

pool, almost all executed exactly once. The application was not using bind variables. Modifying the application to use bind variables

was not an option. Setting the cursor_sharing parameter to FORCE

was also not an option.

Page 62: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

62

Problem Resolution

Bigger is not always better! Reducing the shared pool to 100 Mb provided plenty of space for sharable statements while reducing the effort required by Oracle to maintain the library cache LRU list. This reduced latch contention and boosted performance.

Page 63: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

63

A Summary Of Wait Event Techniques

Isolating a statement and analyzing its wait events

Collecting wait event data for a session or the entire instance at two different times and computing the difference to find the wait events during a specific period of time

Enabling wait event tracing in a session

Page 64: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

64

A Summary Of Wait Event Techniques (continued)

Enabling and disabling timed statistics dynamically to measure wait event times for a specific section of code

Ranking cumulative wait event data in order to see which wait events account for the most wait time

Page 65: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

65

In Conclusion The wait event interface gives you access to a

detailed accounting of how Oracle processes spend their time.

Wait events touch all aspects of the Oracle database server.

The wait event interface will not always give you the answer to every performance problem, but it will just about always give you insights that guide you down the proper path to problem resolution.

Page 66: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

66

The White Paper

A companion white paper to this presentation is available for free download from my company’s website at:

www.dbspecialists.com/present.html

Page 67: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

67

Resources from Database Specialists

The Specialist newsletter– www.dbspecialists.com/specialist.html

Database Rx®

– dbrx.dbspecialists.com/guest• Provides secure, automated monitoring, alert

notification, and analysis of your Oracle databases

Page 68: 1 Interpreting Wait Events To Boost System Performance Roger Schrag Database Specialists, Inc

68

Contact InformationRoger SchragDatabase Specialists, Inc.388 Market Street, Suite 400San Francisco, CA 94111

Tel: 415/344-0500Email: [email protected]: www.dbspecialists.com