Mastering
Performance
with
Oracle
Extended
SQL
Trace
Cary
Millsap
Method
R
Corporation,
Southlake,
Texas,
USA
http://twitter.com/CaryMillsap
[email protected]
Revised
2011/01/13
The
most
recent
update
of
this
paper
is
available
free
of
obligation
at
http://method-‐r.com/downloads.
Oracle's
extended
SQL
trace
data
stream
contains
a
linear
sequential
record
of
every
database
call
and
every
operating
system
call
that
the
Oracle
kernel
executes
in
response
to
the
code
that
you
write.
The
trace
Iile
contains
timings
that
enable
you
to
precisely
measure
how
long
your
code
takes
to
run
and
why.
The
detailed
information
about
individual
database
calls
and
operating
system
calls
is
vital
to
building
scalable
applications
(as
well
as
troubleshooting
them
in
production).
The
information
in
there
is
a
gold
mine,
and
some
of
it
is
available
nowhere
else.
TABLE
OF
CONTENTS 1 PERFORMANCE
AND
TRACING
1. Performance
and
Tracing
.................................................1 You
click
a
button
on
a
web
form.
It’s
a
button
that
you
2. Why
You
Should
Trace
.......................................................2 click
all
the
time.
Normally,
the
system
you’re
using
3. What
Happens
When
You
Trace
....................................2 responds
to
that
click
almost
instantaneously,
but
4. Controlling
the
Trace
..........................................................2 now…
Now,
it’s
taking
more
than
5
seconds
every
time
5. Session
Tracing
.....................................................................3 you
do
it,
and
sometimes
it
takes
more
than
10.
The
6. End-‐to-‐End
Tracing
.............................................................3 obvious
and
very
simple
question
is:
why?
7. End-‐to-‐End
Prerequisites
.................................................4 The
vast
majority
of
people
who
experience
a
problem
8. Finding
Your
Trace
File
.....................................................5 like
this
never
aind
out
the
answer.
9. Performance
Intrusion
......................................................6
10. Tracing
in
Multiplexed
Architectures
..........................6 Think
for
a
minute
about
what
the
answer
ought
to
11. Tracing
While
You
Develop
.............................................7 look
like.
If
you’re
a
IT
professional,
then
you’ve
12. Trace
File
Guided
Tour
......................................................7 probably
seen
so
many
reports
that
the
simple
answer
13. Trace
File
Alphabet
.............................................................9 doesn’t
even
occur
to
you.
Here’s
what
I
want:
I
want
a
14. Trace
File
Alphabet:
DB
Calls
..........................................9 report
telling
me
where
my
time
went.
15. Trace
File
Alphabet:
OS
Calls
...........................................9 I
don’t
want
to
see
how
busy
the
whole
system
was
16. Trace
File
Flow
...................................................................10 when
my
click
took
5
seconds;
I
don’t
want
to
see
all
17. Trace
File
Arithmetic:
Part
1
........................................10 the
“bad”
SQL
that
executed
at
or
near
the
time
when
I
18. Trace
File
Arithmetic:
Part
2
........................................11 had
my
problem;
and
I
don’t
want
to
see
all
the
19. Trace
File
Arithmetic:
Part
3
........................................11 different
kinds
of
waiting
that
the
system
was
doing
20. Tracing
Traps
......................................................................11 when
I
clicked.
I
just
want
to
see
where
my
time
went,
21. Commercial
Trace
File
Tools
........................................12 untainted
by
information
about
anything
not
directly
22. Acknowledgments
............................................................12 relevant
to
my
response
time.
23. About
the
Author
...............................................................12
24. Appendix:
“Hello
World”
Trace
...................................13 With
Oracle,
you
can
have
it.
The
feature
that
gives
it
to
you
is
included
with
every
release
and
every
edition
of
the
Oracle
Database,
from
Express
Edition
(XE)
to
Enterprise
Edition
(EE),
since
1992.
You
don’t
have
to
©
2011
Method
R
Corporation.
All
rights
reserved.
1
buy
an
Option
or
a
Pack
to
use
it.
It’s
called
extended
3 WHAT
HAPPENS
WHEN
YOU
TRACE
SQL
trace.
Tracing
is
an
attribute
of
an
Oracle
session. 2
For
each
session
with
trace
enabled,
any
Oracle
kernel
process3
2 WHY
YOU
SHOULD
TRACE
that
executes
instructions
for
that
session
writes
trace
Oracle
extended
SQL
trace
helps
you
diagnose,
it
helps
data
for
that
session
to
the
process’s
currently
open
you
learn,
and
it
helps
you
debug: 1 trace
aile.
Some
facts:
• System
administrators,
diagnosticians,
and
trouble-‐ • Tracing
is
a
session
attribute.
shooters
will
aind
it
invaluable
for
solving
problems
• But
Oracle
kernel
processes
are
what
write
your
with
programs
for
which
the
source
is
not
readily
trace
data.
available
(or
not
easily
navigable)
since
they
do
not
need
to
be
recompiled
in
order
to
trace
them. • Since
more
than
one
process
can
execute
instructions
for
a
given
Oracle
session
(for
example,
• Students,
hackers,
and
the
overly-‐curious
will
aind
by
using
Oracle
Parallel
Execution
features,
or
by
that
a
great
deal
can
be
learned
about
a
system
and
enabling
Oracle
Shared
Server),
your
trace
data
can
its
system
calls
by
tracing
even
ordinary
programs. appear
in
more
than
one
aile.
• And
programmers
will
aind
trace
data
very
useful
• The
more
exotic
your
architecture
(for
example,
the
for
bug
isolation,
sanity
checking,
and
performance
more
tiers
you
use,
the
more
pooling
features
you
optimization.
Some
problems
cannot
be
solved
use),
the
more
difaicult
it
may
be
to
map
your
trace
without
it. data
to
a
speciaic
user’s
request.
What
makes
tracing
so
good
compared
to
the
other
Exhibit
1
shows
a
simple
case
in
which
a
user
traces
an
performance
information
you
can
get
from
Oracle
is
Oracle
session
connected
through
sqlplus,
causing
an
that
with
tracing,
you
get
a
linear
sequential
record
of
Oracle
kernel
process
to
write
trace
data
to
a
.trc
aile.
everything
your
Oracle
kernel
process
does
while
it’s
trying
to
compute
the
answer
you’ve
asked
for.
You
don’t
have
to
worry
about
gaps
in
your
data
(like
with
Oracle’s
Active
Session
History)
or
aiguring
out
how
to
isolate
your
process’s
work
in
the
huge
picture
of
everything
the
system
is
doing
right
now
(like
with
some
of
Oracle’s
v$
aixed
views
and
all
of
the
GUI
tools
that
use
them).
With
trace
data,
you
see
every
database
call
your
application
makes
to
the
Oracle
kernel,
and
you
see
every
system
call
your
kernel
makes
to
its
host
operating
system.
And
it’s
the
perfect
tool
for
developers,
because
you
don’t
have
to
have
loads
of
Exhibit
1.
The
Oracle
kernel
process,
to
which
a
complicated
permissions
to
use
it.
I
believe
you
can
user
connects
through
some
type
of
application,
learn
more
about
Oracle
performance
with
trace
data
is
the
process
that
writes
the
trace
Iile.
in
a
day
than
you
can
learn
studying
v$
data
for
a
month,
because
trace
data
so
directly
maps
to
the
4 CONTROLLING
THE
TRACE
reality
of
how
the
user,
the
application
code,
and
the
database
interact. You
can
trace
any
Oracle
session
on
your
system
if
you
have
permission
to
execute
the
standard
Oracle
PL/
Trace
ailes
are
the
foundation
of
almost
everything
you
SQL
package
called
dbms_monitor.
This
package
gives
need
to
know
about
Oracle
performance.
1
Oracle
extended
SQL
trace
is
useful
for
the
same
kinds
of
reasons
that
the
Unix
strace
tool
is
useful.
My
description
here
is
paraphrased
from
the
strace
manual
page
at
http://linuxcommand.org/man_pages/strace1.html.
2
An
Oracle
session
is
an
entity
with
a
unique
sid-‐serial#
combination
within
an
Oracle
instance,
which
you
can
see
in
v$session.
3
An
Oracle
kernel
process
is
an
operating
system
process
(which
you
can
inspect
with,
for
example,
a
Linux
command
like
ps,
lsof,
or
strace)
that
executes
the
instructions
required
by
an
Oracle
session.
©
2011
Method
R
Corporation.
All
rights
reserved.
2
you
a
lot
of
control
over
which
sessions
you
trace.
Triggers
Here
are
some
of
its
procedures: For
fast-‐moving
sessions
that
don’t
give
you
time
to
identify
their
session
ids
before
they
begin
session_trace_enable
doing
work
(like
that
Pro*C
program
that
runs
for
Enable
tracing
for
either
the
database
session
20
seconds,
but
that
should
run
in
2),
triggers
are
from
which
the
procedure
is
called,
or
a
speciaic
a
convenient
tool
for
inserting
code
to
enable
session
identiaied
by
its
session
identiaier
and
tracing.
You
can,
for
example,
create
an
after
logon
serial
number.
trigger
whose
body
uses:
database_trace_enable session_trace_enable(
Enable
tracing
for
a
speciaic
instance
or
a
whole
session_id => null,
database. serial_num => null,
…
Oracle
provides
a
disable
procedure
to
match
each
)
enable
procedure. This
code
will
enable
tracing
for
the
session
that’s
logging
on.
There’s
no
need
for
a
corresponding
When
you
use
dbms_monitor,
I
recommend
that
you
before
logoff
trace
disablement,
by
the
way,
use
the
default
value
of
waits=>true.
If
you
use
the
because
logging
off
automatically
disables
the
value
waits=>false,
you’ll
be
using
SQL
trace,
but
not
trace.
extended
SQL
trace.
You’ll
get
a
trace
of
the
Oracle
database
calls
your
application
makes,
but
not
the
OS
sys_context
calls
that
Oracle
makes.
Without
a
record
of
those
OS
The
sys_context
function
gives
you
dozens
of
hooks
calls
in
your
trace
aile,
you’ll
not
be
able
to
account
for
you
can
use
inside
of
a
trigger
body
to
identify
the
potentially
signiaicant
amounts
of
response
time. session
that’s
logging
in.
For
example,
sys_context('USERENV','IP_ADDRESS')
I
also
recommend
that
you
use
the
non-‐default
value
binds=>true.
Setting
binds=>true
causes
the
Oracle
…returns
the
IP
address
of
the
machine
from
Database
to
emit
the
values
that
the
application
bound
which
the
client
is
connected.
With
sys_context,
to
its
placeholder
variables
into
the
trace
data
stream.
you
can
write
PL/SQL
code
in
your
after
logon
For
example,
if
someone
has
executed
this
SQL
trigger
body
that
can
decide
to
trace
only
logins
statement: originating
from
a
speciaic
IP
address,
only
logins
requested
by
certain
client
OS
users,
or
logins
update salary set amount = :v1 where id = :v2
matching
any
of
the
other
criteria
that
sys_context
…then
your
trace
data
will
show
what
values
were
makes
available
to
you.
assigned
to
v1
and
v2.
This
is
invaluable
information
Running
suspicious
SQL
in
your
own
session
for
creating
reproducible
test
cases
for
solving
There
are
lots
of
ways
you
can
identify
suspicious
problems.
However,
be
aware
of
the
data
security
SQL
statements:
you’ll
aind
them
in
OEM,
in
your
implication
of
emitting
bind
data
into
a
trace
aile;
AWR
or
ADDM
reports,
or
by
querying
v$sqlstat.
when
you
do
it,
you
are
copying
potentially
sensitive
Copy
them
and
run
them
in
SQL*Plus
or
Oracle
data
from
your
database
to
your
aile
system. SQL
Developer.
You
can
plug
in
whatever
bind
variable
values
you
need
and
trace
to
your
heart’s
5 SESSION
TRACING content.
One
of
the
nice
things
about
Oracle
tracing
is
that
dbms_monitor.database_trace_enable
you’re
not
required
to
change
an
application
in
order
If
all
else
fails,
there’s
always
the
nuclear
bomb
to
use
it.
Even
if
the
application
you’re
using
is
option
of
tracing
everything
that
happens
over
completely
un-‐modiaiable
and
was
in
no
way
designed
some
time
interval
you
choose.
Beware,
however:
to
cooperate
with
tracing,
you
still
have
the
following
enabling
trace
for
a
whole
instance
or
database
very
powerful
tools
at
your
disposal: will
only
activate
tracing
for
new
sessions
that
log
in
after
you
enable
the
trace.
It
won’t
enable
dbms_monitor.session_trace_enable
tracing
for
sessions
that
are
already
logged
in.
With
session_trace_enable,
you
can
trace
any
session
on
your
system
if
you
know
its
session
id
and
serial
number.
You
just
have
to
be
meticulous
6 END-‐TO-‐END
TRACING
to
enable
the
trace
immediately
before
the
user
There
are
three
major
milestones
in
the
history
of
issues
the
slow
request,
and
then
disable
the
trace
tracing
in
the
Oracle
Database:
immediately
after
the
slow
request
is
fulailled.
©
2011
Method
R
Corporation.
All
rights
reserved.
3
• In
1988,
Oracle
version
6
introduced
SQL
trace,
the
business
task
that
the
user
is
experiencing
right
which
let
us
discover
the
start
and
end
time
of
every
there
at
her
keyboard.
When
you
trace
a
session
based
database
call
an
application
executed. on
its
session
id,
you
almost
always
capture
either
more
trace
data
than
you
really
want,
or
not
enough.
• In
1993,
Oracle
version
7
introduced
extended
SQL
trace,
which
let
us
discover
the
duration
of
every
That’s
because
it
takes
you
a
little
time
to
identify
the
system
call
the
database
executed. session’s
id
before
you
can
execute
the
session_trace_enable
call.
• In
2003,
Oracle
version
10
introduced
end-‐to-‐end
extended
SQL
trace,
which
let
us
activate
tracing,
However,
when
you
activate
tracing
for
a
speciaic
not
just
for
sessions
whose
session
ids
we
knew,
but
client
id
or
service-‐module-‐action
name
combination,
for
sessions
with
speciaic
attribute
values. you
create
a
standing
order
to
Oracle,
instructing
the
kernel
to
begin
tracing
any
session
that
changes
its
The
third
milestone—end-‐to-‐end
tracing—makes
it
client
id
to
your
speciaic
value,
or
whenever
it
changes
possible
for
you
to
specify
the
intent
to
trace
a
its
server-‐module-‐action
name
combination
to
your
business
task
in
advance
of
that
task
ever
running.
speciaic
values.
And
then
Oracle
will
stop
tracing
Then,
the
Oracle
Database
will
automatically
enable
immediately
when
that
session
changes
its
identifying
tracing
for
any
session
that
executes
the
task
you
have
information
to
something
different.
speciaied.
Pure
magic.
The
way
you
specify
the
standing
order
to
trace
certain
tasks
is
with
the
following
dbms_monitor
7 END-‐TO-‐END
PREREQUISITES
procedures:
But
there’s
a
catch
with
end-‐to-‐end
tracing.
How
can
client_id_trace_enable
dbms_monitor
know
a
session’s
client
id
or
service-‐
Enable
tracing
for
any
database
session
whose
module-‐action
names?
The
answer:
your
application
client
identiaier
matches
the
one
you
specify.
has
to
provide
those
attribute
values.
If
your
serv_mod_act_trace_enable application
doesn’t
name
its
tasks
or
set
the
client
id
Enable
tracing
for
any
database
session
whose
attribute
for
its
sessions
in
a
useful
way,
then
you
can’t
service,
module,
and
action
names
match
the
ones
use
the
dbms_monitor
end-‐to-‐end
tracing
features.
you
specify.
If
you’re
using
an
off-‐the-‐shelf
application,
your
only
For
example,
if
you
wanted
to
trace
any
user
whose
recourse
may
be
to
live
without
the
end-‐to-‐end
tracing
client
id
is
192.168.1.104,
you’d
use
features
(though
you
can
still
use
the
techniques
dbms_monitor.client_id_trace_enable( described
in
section
5)
and
lobby
your
vendor
to
client_id => '192.168.1.104', instrument
a
future
version
of
your
application
in
the
waits => true,
binds => true,
manner
I’m
about
to
describe.
If
you
can
change
your
plan_stat => 'ALL_EXECUTIONS' application
source
code
yourself,
instrumenting
for
) end-‐to-‐end
tracing
is
not
hard
to
do.
The
only
thing
…And
that’s
that.
No
matter
when
the
next
person
you
really
have
to
do
is
have
each
session
set
what
logged
in
from
192.168.1.104,
his
work
would
be
Oracle
calls
its
user
session
handle
attributes.
There
are
traced.
If
you
wanted
to
trace
any
business
task
whose
several
ways
to
do
it.
service
is
called
FINAPPS,
whose
module
is
called
One
way
you
can
set
those
session
handle
attributes
GLPPOS,
and
whose
action
is
called
Concurrent for
your
code
is
to
use
these
standard
Oracle
PL/SQL
Request,
you’d
execute: packages:
dbms_monitor.serv_mod_act_trace_enable(
service_name => 'FINAPPS',
dbms_session
module_name => 'GLPPOS', The
set_identiIier
procedure
lets
you
set
the
calling
action_name => 'Concurrent Request' session’s
client
identiaier.
waits => true,
binds => true, dbms_application_info
plan_stat => 'ALL_EXECUTIONS' The
set_action
procedure
lets
you
set
the
calling
)
session’s
action
name,
and
the
set_module
…Then
you’d
be
set
to
trace
your
next
several
GL
procedure
lets
you
set
the
calling
session’s
module
Posting
runs. and
action
names
together.
Before
end-‐to-‐end
tracing,
the
hardest
thing
about
If
you
prefer
a
simpler
approach
to
setting
your
tracing
was
getting
a
trace
aile
that
represents
exactly
session
handle
attributes,
you
can
use
the
©
2011
Method
R
Corporation.
All
rights
reserved.
4
Instrumentation
Library
for
Oracle
(ILO),
a
free
open-‐ procedures
instead,
until
you
can
convince
the
people
source
project
that
Method
R
Corporation
maintains
at
who
built
your
application
to
instrument
the
SourceForge.
ILO
gives
you
PL/SQL
packages
that
application
so
that
you
can
measure
and
manage
its
make
it
dead
simple
for
an
application
developer
to
performance
while
you
operate
it.
Until
then,
not
only
deaine
where
in
an
application’s
code
path
each
will
you
not
be
able
to
trace
as
alexibly,
you
also
won’t
business
task
begins
and
ends.
It
sets
all
the
“hooks”
be
able
to
group
application
performance
statistics
that
your
systems
DBAs
will
need
later
to
trace
using
other
applications
like
Oracle
Enterprise
speciaic
business
tasks
by
name.
ILO
gives
you
several
Manager.
extra
features
as
well,
which
are
detailed
in
the
project’s
documentation. 8 FINDING
YOUR
TRACE
FILE
If
it
bothers
you
to
insert
additional
database
calls
into
Once
you’ve
traced
your
code,
you’ll
need
to
aind
your
your
application
(and
if
you’re
building
an
application
trace
aile.
The
process
running
your
Oracle
kernel
code
that
will
serve
thousands
of
database
requests
per
writes
your
trace
aile
to
the
operating
system
directory
second,
it
should),
then
you
should
choose
another
named
by
an
Oracle
instance
parameter.
In
Oracle
option.
Some
Oracle
APIs
allow
you
to
pass
service-‐ version
11,
the
Oracle
kernel
will
write
your
ailes
into
module-‐action
names
and
a
client-‐id
from
the
a
directory
that
you
can
identify
by
using
the
following
application
to
the
database
as
an
attribute
of
each
of
SQL
statement:
the
database
calls
that
you
were
already
determined
select * from v$diag_info where name='Diag Trace'
to
make.
In
older
versions
of
Oracle,
you
can
identify
your
trace
The
Oracle
user
session
handle
attributes
you’ll
need
aile
directories
by
using
this
statement:
to
set
are
these:
select * from v$parameter where name in
OCI_ATTR_CLIENT_IDENTIFIER ('user_dump_dest','background_dumnp_dest')
OCI_ATTR_SERVICE
OCI_ATTR_MODULE In
Oracle
version
10
and
prior,
the
user_dump_dest
OCI_ATTR_ACTION
directory
is
probably
where
most
of
your
trace
ailes
You
can
set
them,
for
example,
with
the
Oracle
Call
will
be.
If
you
use
Oracle
parallel
execution
features,
Interface
(OCI)
OCIAttrSet
function,
or
with
the
JDBC
then
you’ll
aind
some
of
your
trace
ailes
in
the
setEndToEndMetrics
method.
These
are
client-‐side
background_dump_dest
directory.
function
calls
that
don’t
require
a
round-‐trip
to
the
Different
ports
of
Oracle
use
different
naming
database.
Once
you
have
made
a
call
to
set
your
user
conventions
for
trace
ailes.
Your
trace
aile
names
will
session
handle
attributes,
each
database
call
that
your
probably
look
something
like
one
of
the
following:
application
code
makes
after
that
is
marked
with
the
xe_ora_10840.trc
identifying
information
that
dbms_monitor
needs. prod7_23389_ora.trc
ora_1492_delta1.trc
Setting
your
Oracle
user
session
handle
attributes
ORA01215.trc
yourself
enables
you
to
instrument
your
application
fin1_ora_11297_POSTING.trc
with
no
extra
database
calls
at
all,
which
means
no
MERKUR_S7_FG_ORACLE_013.trc
extra
network
round-‐trips
between
the
application
Trace
ailes
may
look
different
on
different
platforms
and
the
database.
It’s
the
most
scalable
way
to
and
on
different
versions
of
Oracle,
but
you
can
count
instrument
your
code. on
your
trace
aile
names
containing
at
least
some
of
To
summarize,
you
can
instrument
your
application
the
following
elements:
code
for
end-‐to-‐end
tracing
by
calling
standard
Oracle
PL/SQL
procedures
(or
calling
them
through
someone
• The
string
ora.
else’s
package,
like
ILO),
or
you
can
do
it
with
no
extra
• Your
Oracle
instance
name.
database
calls
by
setting
session
handle
attributes
• Your
Oracle
kernel
process
id
(on
Microsoft
directly
with
an
Oracle
API
like
OCI
or
JDBC. Windows,
it
will
be
your
process’s
thread
id).
If
your
application
is
not
designed
to
set
these
• If
you
set
a
traceIile_identiIier
within
your
Oracle
attributes
for
your
sessions,
then
you
won’t
be
able
to
session
(with
an
alter
session
command),
then
the
use
the
client_id_trace_enable
or
string
value
of
that
parameter.
serv_mod_act_trace_enable
procedures
in
• The
sufaix
.trc.
dbms_monitor.
You’ll
have
to
use
only
the
session_trace_enable
and
database_trace_enable
©
2011
Method
R
Corporation.
All
rights
reserved.
5
If
you’re
writing
code
that
will
connect
to
an
Oracle
they’ll
get
into
trouble
if
they
do
anything
that
might
instance
that
someone
else
manages,
you’ll
need
to
make
performance
worse
than
it
already
is.
However,
coordinate
with
that
person
to
get
permissions
to
read
your
goal
in
tracing
is
to
learn
how
much
faster
a
your
trace
ailes.
Without
access
to
your
trace
ailes,
program
ought
to
be
running.
Isn’t
that
information
optimizing
the
code
you
write
is
going
to
be
a
lot
more
worth
at
least
as
much
as
a
one-‐time
response
time
expensive
for
your
company. penalty
induced
by
a
trace?
I’ve
seen
people
work
on
problems
for
months
on
end
without
trace
data,
when
9 PERFORMANCE
INTRUSION they
could
have
cleared
everything
up
with
just
a
single
one-‐time
trace.
Even
if
tracing
imposed
aive
One
thing
that
everyone
always
wants
to
know
is,
times
the
performance
penalty
that
it
does,
I
wouldn’t
“What
is
the
performance
penalty
of
tracing?”
People
use
it
any
less.
get
a
little
nervous
about
all
those
extra
timer
calls
that
their
Oracle
kernel
processes
must
execute
when
10 TRACING
IN
MULTIPLEXED
ARCHITECTURES
you
turn
trace
on.
I
mentioned
in
section
3
that
tracing
is
an
attribute
of
What
they
don’t
realize
is
that
their
Oracle
kernel
the
Oracle
session.
However,
many
systems
these
days
process
is
making
all
those
timer
calls
anyway,
have
many
layers
of
software
between
the
user
and
whether
tracing
is
activated
or
not.
How
else
could
it
the
Oracle
session,
and
many
of
those
layers
employ
publish
the
timing
information
you
see
in
aixed
views
pooling
technologies
that
conceal
the
user’s
identity
like
v$sesstat,
v$session_event,
and
v$session_wait?
The
from
her
Oracle
session.
actual
performance
intrusion
of
tracing
is
the
cost
of
the
additional
I/O
calls
required
to
persist
to
your
The
solution,
in
general,
is
this:
where
there’s
a
will,
trace
aile
the
information
Oracle
is
already
collecting. there’s
a
way.
If
you
are
committed
to
tracing
a
speciaic
user’s
speciaic
business
task,
it
can
be
done.
Most
people
should
trace
only
a
few
sessions
at
a
time.
Here
are
some
of
the
tools
you
can
use
to
do
it:
If
you
don’t
have
specialized
tools,
you’ll
never
in
your
life
be
able
to
sift
through
all
the
trace
ailes
that
an
User
session
handle
attributes
Oracle
Database
system
can
generate
in
a
good,
busy
The
service,
module,
action,
and
client
id
hour
of
work.
If
you
want
to
trace
a
lot
of
sessions
at
attributes
are
the
right
and
proper
cure
for
tracing
once
(and
there
are
legitimate
reasons
for
wanting
to),
in
pooled
architectures.
When
the
application
you
can
trace
as
many
sessions
as
your
hardware
identiaies
its
users
to
the
Oracle
database,
the
capacity
will
allow.
If
you
trace
infrequently,
then
you
dbms_monitor
package
lets
you
enable
tracing
for
don’t
have
to
be
too
careful
about
your
trace
aile
exactly
the
tasks
you
want
traced,
and
then
tools
destination.
If
you
trace
a
lot
of
sessions
like
Oracle’s
trcsess
help
you
do
the
work
of
simultaneously,
then
just
make
sure
you
write
your
concatenating
the
various
fragments
of
trace
data
trace
ailes
to
a
drive
array
that
has
all
the
storage
that
will
describe
how
your
task
spent
its
time.
capacity
and
throughput
capacity
you
need,
and
then
Session
isolation
trace
all
you
want. If
your
application
doesn’t
set
its
session
handle
Unless
you’re
using
a
version
of
Oracle
that
has
a
attributes
that
allow
you
to
distinguish
the
trace-‐related
performance
bug
(Oracle
bug
3009359,
business
task
you’re
interested
in
from
the
introduced
in
version
9.2.0.2,
was
a
famous
one),
your
thousands
of
other
business
tasks
running
at
the
program
will
probably
run
with
±5%
of
the
duration
same
time,
then
isolate
your
user
into
a
that
it
takes
to
run
it
without
tracing.4
If
a
program’s
conaiguration
where
you
can
make
the
distinction.
response
time
gets
more
than
10%
worse
when
you
For
example,
instead
of
your
user
connecting
to
trace
it,
then
you
should
check
whether
your
I/O
her
usual
http://www.app.com
site,
where
her
task
subsystem
to
which
you’re
writing
trace
ailes
is
ok,
gets
stripped
of
her
identity
as
it
enters
some
check
whether
your
session’s
setting
of
statistics_level
session
pool
or
connection
pool
with
a
thousand
is
what
you
want
it
to
be,
and
check
your
Oracle
other
tasks,
have
her
connect
to
http://
Support
database
for
bugs. www.app.com:88,
where
her
task
is
the
only
task
in
a
session
pool
or
connection
pool
with
a
pool
People
who
ask
about
the
performance
intrusion
of
size
of
exactly
one.
You
can
trace
every
session
tracing
generally
ask
because
they’re
fearful
that
4
That’s
right,
plus
or
minus.
Sometimes
a
program
will
run
faster
when
you
trace
it.
It
sounds
nice,
but
it’s
usually
not
what
you
want.
©
2011
Method
R
Corporation.
All
rights
reserved.
6
connecting
to
the
database
through
port
88,
4. Developers
and
database
administrators
which,
at
the
time
you’re
doing
your
analysis,
you
participate
together
during
integration
testing
to
know
will
be
nobody
else
but
the
one
user
you’re
trace
the
application
code
(which
is
easy
with
the
analyzing. user
session
handle
attributes
all
set)
and
study
the
trace
ailes
to
ensure
that
the
code
is
efaicient
11 TRACING
WHILE
YOU
DEVELOP under
load
and
that
there
are
no
unwanted
performance
interdependencies
among
competing
The
most
important
time
for
a
developer
to
trace
is
sessions.
early
in
the
software
development
lifecycle,
where
defects
are
cheaper
and
easier
to
aix
than
any
other
5. Production
system
administrators
(database
time
in
your
project.5
Fortunately,
tracing
is
easiest
in
administrators,
for
example)
trace
the
application
the
development
environment. code
periodically
in
production
when
the
application
is
behaving
well,
to
record
a
baseline
I
can
remember
since
my
earliest
days
of
working
with
of
how
each
application
task
is
supposed
to
Oracle
having
some
kind
of
sqlplus
script
that
will
turn
perform
(which
is
easy
with
the
user
session
trace
on
or
off
when
you
call
it.
It
could
be
as
simple
as
handle
attributes
all
set).
two
scripts
traceon.sql
and
traceoff.sql
that
look
like
6. During
performance
problem
episodes,
this:
production
operators
trace
problem
business
$ cat traceon.sql tasks
(session
handle
attributes
make
this
easy)
exec dbms_monitor.session_trace_enable(binds=>true);
$ and
work
together
with
application
developers—
$ cat traceoff.sql who
are
already
familiar
with
what
the
trace
aile
exec dbms_monitor.session_trace_disable(); for
the
given
task
normally
looks
like—to
solve
When
you
write
your
code,
it
works
like
this: problems
quickly.
@traceon With
habitual
tracing
throughout
a
software
lifecycle,
-- Your code goes here applications
tend
to
have
fewer
performance
@traceoff
problems,
and
they
tend
to
get
aixed
more
quickly
on
Nowadays,
I
use
the
MR
Trace
extension
for
Oracle
the
rare
occasion
when
they
do
have
a
problem.
They
SQL
Developer.
When
MR
Trace
is
enabled,
every
Run
tend
to
evolve
toward
being
fast,
optimized
systems
Script
button
click
creates
a
trace
aile,
which
MR
Trace
that
can
last
a
long
time.
…Much
like
the
Oracle
automatically
fetches
for
you
from
your
database
Database,
which
is
itself
heavily
performance
server
to
your
workstation.
It
also
lets
you
tag
your
instrumented.
local
trace
ailes
to
make
them
easy
to
aind
later.
The
best
thing
a
developer
can
do
to
promote
high
12 TRACE
FILE
GUIDED
TOUR
performance
over
an
application’s
long
lifespan
is
to
Once
you
have
your
trace
aile
in
hand,
the
real
fun
make
it
easy
to
trace
the
application
throughout
its
begins.
Now
you
have
a
call-‐by-‐call
description
of
what
production
lifecycle.
Of
course,
you
do
this
by
coding
the
Oracle
Database
did
throughout
your
entire
the
application
to
set
its
own
user
session
handle
response
time.
attributes,
as
I’ve
described
in
section
7.
If
your
only
interface
to
the
Oracle
Database
has
been
Applications
work
better
when
the
world
works
like
SQL
or
PL/SQL
executed
through
client
software
like
this: sqlplus
or
Oracle
SQL
Developer,
you
may
not
know
1. Application
developers
trace
their
SQL
and
PL/ about
the
distinct
steps
that
Oracle
uses
to
process
a
SQL
code
as
they
write
it.
They
study
their
trace
single
statement.
Exhibit
2
shows
the
steps
from
the
ailes
to
ensure
that
the
code
they’re
writing
is
perspective
of
the
Oracle
Call
Interface.
efaicient.
2. Developers
become
aluent
in
understanding
what
the
trace
ailes
mean,
which
results
in
more
efaicient
application
code.
3. Application
developers
code
applications
to
set
their
user
session
handle
attributes.
5
Barry
Boehm,
1981,
Software
Engineering
Economics,
Englewood
Cliffs
NJ:
P
T
R
Prentice
Hall,
p40.
©
2011
Method
R
Corporation.
All
rights
reserved.
7
line
38,
the
Oracle
kernel
process
issued
an
OS
write
call
to
send
the
result
of
the
prepare-‐execute
call
pair
back
to
the
client
(which
Oracle
calls
SQL*Net
message
to
client).
On
line
39
is
a
fetch
call,
which
consumed
8
µs
and
returned
1
row.
Line
40
shows
the
execution
plan
that
Oracle
used
to
process
my
query.
Line
41
shows
the
Oracle
kernel
blocked
on
an
OS
read
call
for
375
µs,
awaiting
another
database
call
from
the
client
(which
Oracle
calls
SQL*Net
message
from
client).
On
line
42,
the
kernel
has
processed
a
second
fetch
call,
consuming
1
µs
and
fetching
no
rows.
Line
43
shows
that
the
kernel
issued
another
OS
write
call
to
send
the
zero-‐row
result
set
back
to
the
client
(which
of
course
informs
the
client
that
there
are
no
more
rows
to
be
had
from
the
query).
Line
44
shows
the
kernel
blocked
for
1,627
µs
on
another
OS
read
call,
awaiting
instructions
for
what
to
do
next.
Line
45
Exhibit
2.
Steps
in
processing
a
SQL
statement,
shows
that
the
next
action
was
a
commit.
from
the
OCI
Programmer’s
Guide.
The
remainder
of
the
trace
aile
(shown
in
its
entirety
You
can
see
this
sequence
of
activity
whenever
you
in
section
24)
is
interesting,
because
it
shows
trace
even
a
simple
SQL
statement
like
this: something
you
might
not
have
expected:
the
session
select 'Hello world' from dual
inserted
a
row
into
sys.aud$.
From
this,
I
can
tell
that
my
instance
is
set
up
for
session-‐level
auditing.
I
didn’t
An
Oracle
11.2.0.2.0
trace
aile
for
an
execution
of
this
have
to
work
my
way
down
a
checklist
to
aigure
that
SQL
statement
is
shown
in
its
entirety
in
section
24.
out;
plus,
my
trace
data
will
show
me
exactly
the
cost
Here
are
some
highlights. of
that
overhead
upon
my
response
time.
On
line
34,
you
can
see
the
“Hello
world”
query
itself.
On
line
48,
you
can
see
the
SQL
statement.
Line
50
Lines
36–45
show
how
Oracle
processed
the
query: shows
that
the
prepare
call
for
that
statement
32. ===================== consumed
93
µs.
On
lines
51–156,
you
can
see
the
33. PARSING IN CURSOR #7285244 len=30 dep=0 uid=5 oct=3 values
that
were
bound
into
the
statement’s
lid=5 tim=1294688002747560 hv=1604528588 ad='3d526cd8'
sqlid='guthms1gu6afc'
placeholder
variables
(:1,
:2,
…,
:22)
within
that
34. select 'Hello world' from dual statement.
Line
157
shows
that
the
execute
call
for
the
35. END OF STMT insert
took
1,733
µs.
Line
158
shows
the
execution
36. PARSE …,e=70,…
37. EXEC …,e=112,…
plan
for
the
insert,
and
line
159
shows
that
the
close
38. WAIT …'SQL*Net message to client' ela= 2 call
for
the
insert
took
5
µs.
Line
160
shows
that
the
OS
39. FETCH …,e=8,…,r=1,… call
Oracle
uses
to
implement
its
log
Iile
sync
event
40. STAT …op='FAST DUAL (…)'
41. WAIT …'SQL*Net message from client' ela= 375
consumed
153
µs,
and
the
ainal
two
lines
of
the
trace
42. FETCH …,e=1,…,r=0,… aile
show
two
more
close
calls,
which
consumed
9
µs
43. WAIT …'SQL*Net message to client' ela= 1 and
30
µs.
44. WAIT …'SQL*Net message from client' ela= 1627
45. XCTEND rlbk=0,… I
hope
you
can
see
from
just
this
little
tour
how
it
is
Here,
you
can
see
the
query
being
prepared
(the
possible
to
use
trace
data
to
see
exactly
where
your
PARSE
line),
which
consumed
70
µs.6
Next,
it
was
time
has
gone.7
You
just
need
to
know
how
to
read
executed
(regarding
Exhibit
2,
there
was
no
bind
them.
Let’s
begin
with
the
alphabet.
necessary,
since
my
query
didn’t
contain
any
placeholders),
which
consumed
112
µs.
Then,
on
6
Call
durations
in
trace
ailes
are
expressed
in
microseconds,
abbreviated
µs.
1
µs
=
.000001
seconds,
or
1/1,000,000th
of
a
second.
7
You
can
see
another
trace
aile
guided
tour
in
“For
Developers:
Making
Friends
with
the
Oracle
Database
for
Fast,
Scalable
Applications.”
©
2011
Method
R
Corporation.
All
rights
reserved.
8
13 TRACE
FILE
ALPHABET p=1
This
call
obtained
1
Oracle
block
via
OS
read
calls.
Trace
ailes
look
plenty
ugly
when
you
airst
meet
them,
cr=7
but
it’s
not
too
difaicult
to
get
a
hang
of
what
they
This
call
executed
7
“consistent
mode”
accesses
mean.
There
are
really
only
two
types
of
lines
in
the
upon
the
Oracle
database
buffer
cache.
trace
aile
that
tell
you
where
time
has
gone:
cu=0
Database
call
lines This
call
executed
0
“current
mode”
accesses
upon
Database
call
lines
begin
with
the
keyword
PARSE,
the
Oracle
database
buffer
cache.
EXEC,
FETCH,
CLOSE,
UNMAP,
or
SORT
UNMAP.
mis=0
Such
a
line
indicates
that
an
application
client
has
This
call
encountered
0
misses
upon
the
Oracle
made
a
database
call,
and
that
the
Oracle
Database
library
cache.
has
responded
to
it. r=1
System
call
lines This
call
returned
1
row.
System
call
lines
begin
with
the
keyword
WAIT.
dep=2
Such
a
line
indicates
that
the
Oracle
kernel
There
were
2
levels
of
database
calls
below
this
process
has
made
an
OS
call,
and
that
the
OS
has
call
in
the
database
call
stack.
That
is,
this
call
is
a
responded
to
it. child
of
another
db
call,
which
in
turn
is
a
child
of
That’s
it;
just
two. another
db
call.
og=4
14 TRACE
FILE
ALPHABET:
DB
CALLS This
call’s
Oracle
optimizer
goal
is
choose.
The
four
choices,
in
order,
are
all,
Iirst,
rule,
and
With
exception
of
the
CLOSE
call,
which
doesn’t
choose.
contain
all
the
aields
that
the
other
database
calls
do,
plh=3992920156
all
contain
the
same
aields.
They
look
like
this: This
call’s
execution
plan
hash
value
is
FETCH #12390720:c=8000,e=1734,p=1,cr=7,cu=0,mis=0,r=1, 3992920156.
dep=2,og=4,plh=3992920156,tim=1294438818783887
tim=1294438818783887
Here’s
what
the
aields
mean: This
call
completed
at
time
1,294,438,818,783,887
FETCH ±1
µs.
The
tim
value
is
given
in
µs,
but
the
answer
This
was
a
fetch
call
(not
a
parse
or
exec
or
some
to
“µs
since
what?”
varies
by
platform.
All
that
other
kind). really
matters
is
for
the
tim
values
to
be
consistent
within
a
given
trace
aile,
which
they
usually
are.9
#12390720
The
call’s
cursor
handle
id
is
12390720.
You
can
search
backwards
(toward
the
beginning)
in
your
15 TRACE
FILE
ALPHABET:
OS
CALLS
trace
aile
to
aind
the
SQL
or
PL/SQL
statement
for
All
OS
call
lines
resemble
this:
which
this
call
was
made. WAIT #12397272: nam='db file sequential read' ela= 221
c=8000 file#=1 block#=2735 blocks=1 obj#=423
This
call
consumed
8,000
±10,000
µs
of
CPU
time.
tim=1294438818791494
Yes,
Oracle
measured
the
call
as
having
consumed
Here’s
what
the
aields
mean:
[far]
more
CPU
time
than
the
call’s
actual
elapsed
WAIT
duration.8
This
call
is
an
OS
call,
not
a
database
call.10
e=1734
#12397272
This
call
consumed
1,734
±1
µs
of
elapsed
time.
The
call’s
cursor
handle
id
is
12397272.
8
For
a
detailed
description
of
why
the
CPU
consumption
statistic
is
accurate
to
only
±10,000
µs
(except
on
Solaris
machines
on
which
microstate
accounting
is
enabled),
see
Optimizing
Oracle
Performance,
by
Cary
Millsap
and
Jeff
Holt
(O’Reilly
2003),
pp161–
165.
9
They’re
most
likely
not
to
be
consistent
within
a
given
aile
on
Microsoft
Windows
systems,
where
tim
values
wrap
(that
is,
get
as
large
as
they
can
go
and
then
start
over
at
0)
more
frequently
than
on
other
systems.
10
I’ve
had
good
fun
explaining
why
the
word
wait
is
the
wrong
word
to
use
in
this
context.
See
for
example
my
essay,
“Dang
it,
people,
they’re
syscalls,
not
‘waits’...”
©
2011
Method
R
Corporation.
All
rights
reserved.
9
nam='db file sequential read' each
dep=1
call
as
the
child
of
the
dep=0
call
that
This
call
was
a
read
of
database
aile
that
retrieved
followed
it
in
the
trace
data
stream.
With
tim
values
on
one
or
more
blocks
and
stored
them
contiguously
all
our
call
lines,
it
is
no
longer
necessary
to
do
that.
somewhere
in
memory.
Oracle
Corporation
gives
You
can
determine
all
the
parent-‐child
information
each
OS
call
its
kernel
makes
a
distinct
name,
and
you
need
now
just
by
noticing
at
what
time
each
call
the
company
documents
the
meanings
of
those
begins
and
ends.
names
so
you
can
more
easily
understand
what’s
going
on. 17 TRACE
FILE
ARITHMETIC:
PART
1
ela= 221
This
call
consumed
221
±1
µs
of
elapsed
time. Now
you
know
the
trace
aile
alphabet
and
how
trace
aile
lines
alow
forth
at
the
completion
of
the
database
file#=1 block#=2735 blocks=1
calls
your
client
application
makes
and
the
OS
calls
This
read
call
(probably
a
pread
call—you
can
tell
your
Oracle
kernel
makes.
The
next
step
is
to
by
using
strace)
read
1
block
from
Oracle
aile
id
1,
understand
a
few
details
about
how
time
works
in
beginning
at
block
id
2735.
Each
call
has
three
Oracle
trace
ailes.
parameters
like
these,
which
are
named
differently
depending
on
the
call
name.
These
First,
a
database
call’s
total
duration
(e)
is
three
parameters
give
you
contextual
information
approximately
the
sum
of
the
time
it
spends
using
CPU
about
what
the
call
was
meant
to
accomplish. (c)
plus
the
duration
of
the
OS
calls
made
by
the
call.
obj#=423 The
equation
is
only
approximate,
primarily
because
This
call
operated
upon
the
Oracle
object
with
of
the
±10,000
µs
on
the
CPU
time
measurement.
id
423.
When
a
call
operated
upon
no
object
in
Expressed
as
a
precise
equality,
we
have,
for
a
given
particular,
the
Oracle
kernel
will
emit
obj#=-1. database
call
i:
tim=1294438818791494
ei = ci + ∑ j ∈Children(i ) ela j + Δ i
(1)
This
call
completed
at
time
1,294,438,818,791,494
±1
µs.
The
term
∆i
there
at
the
end
is
the
time
within
the
known
duration
of
the
call
that
is
unaccounted
for
16 TRACE
FILE
FLOW (unexplained,
if
you
prefer)
by
Oracle.
It
can
be
The
Oracle
kernel
emits
trace
lines
as
calls
complete.
positive
or
negative
or
zero.
As
much
as
you’d
like
for
You
have
to
know
this
to
determine
the
parent-‐child
this
unaccounted-‐for
duration
to
be
zero,
it
just
won’t
relationships
among
calls.
For
example,
what
can
you
be.
However,
in
the
aggregate,
unaccounted-‐for
time
know
about
the
following
(simpliaied)
trace
data
won’t
usually
be
a
material
contributor
to
total
stream? response
time.
When
it
is,
it’s
an
indication
that:
PARSE #2:…,e=1,…,tim=5 • Either
you
have
forgotten
to
trace
the
OS
calls
(as
EXEC #2:…,e=2,…,tim=8
with
waits=>false);
FETCH #2:…,e=4,…,tim=15
PARSE #1:…,e=15,…,tim=17
• Or
you
have
an
un-‐patched
Oracle
bug;
From
just
the
data
shown
here,
you
can
determine
the
• Or
you
have
a
process
preemption
problem
start
and
end
time
of
each
call,
and
from
that,
you
can
(perhaps
too
much
paging
or
swapping).
work
out
the
parent-‐child
relationships
among
these
Here’s
how
the
arithmetic
works
out
in
a
two-‐line
calls:
trace
aile
excerpt:
tim call
--- -------------- 1. WAIT #124367516: nam='Disk file operations I/O'
2 PARSE #1 { ela= 124 FileOperation=2 fileno=4 filetype=2 obj#=-1
4 PARSE #2 { tim=1294702369858445
5 } 2. FETCH #124367516:c=0,e=386,p=0,cr=6,cu=0,mis=0,r=14,
6 EXEC #2 { dep=0,og=1,plh=3956160932,tim=1294702369858666
8 }
11 FETCH #2 { Here,
you
have
an
OS
call
on
line
1
that
is
a
child
of
the
15 } database
call
on
line
2.
You
can
prove
that
by
17 } comparing
tim
and
duration
values:
Before
Oracle
10.2,
when
there
were
no
tim
values
on
the
OS
call
lines,
we
inferred
call
parent-‐child
hierarchy
from
the
dep
values
on
database
call
lines
and
from
the
lines’
relative
locations.
We
attributed
©
2011
Method
R
Corporation.
All
rights
reserved.
10
tim
----------------
call
---------------------
19 TRACE
FILE
ARITHMETIC:
PART
3
1294702369858280 FETCH #124367516 {
1294702369858321 WAIT #124367516 {
The
ainal
category
of
response
time
to
describe
is
the
1294702369858445 } time
that
is
unaccounted-‐for
between
the
top-‐level
1294702369858666 } database
and
OS
calls.
This
one
is
simple:
For
the
database
call
(a
fetch),
we
have
e
=
386,
and
Δ between = R − ∑ i ∈ TopLevelCalls ei
(3)
c
=
0.
The
sum
of
the
OS
call
durations
is
simply
124.
Using
the
equation
above,
this
leaves
an
unaccounted-‐
That
is,
the
total
between-‐call
unaccounted-‐for
for
duration
of
∆
=
262.
Here’s
what
the
call’s
response
duration
is
the
total
response
time
that
we
know
has
time
looks
like
in
the
form
of
a
proaile
table:
passed
minus
the
time
accounted
for
by
top-‐level
calls
Duration
(µs) Call (both
database
and
OS)
in
the
trace
aile.
So
Equation
1
262 67.9% unaccounted-‐for
within
calls
gives
us
most
of
the
detail
that
you
need
to
make
up
your
proaile.
Equation
2
gives
you
the
total
response
124 32.1% Disk
aile
operations
I/O time
that
you
need
to
account
for.
And
Equation
3
0 0.0% CPU
service,
fetch
calls gives
you
the
label
to
which
to
assign
the
remainder
of
386 100.0% Response
time the
unexplained
duration.
These
are
the
three
elements
you
need
to
create
a
complete
response
time
Exhibit
3.
Response
time
proIile
for
the
fetch
proaile.
database
call,
using
Equation
1.
20 TRACING
TRAPS
This
is
only
a
simple
example.
You
can
extend
the
same
logic
to
database
calls
that
are
parents
of
many
When
performance
is
the
question,
tracing
is
usually
more
OS
calls,
or
even
calls
that
are
parents
of
one
or
my
answer.
However,
it’s
not
always
easy.
Here
are
more
levels
of
other
database
calls. some
of
the
pitfalls
to
avoid.
Data
collection.
By
far,
the
most
common
problem
we
18 TRACE
FILE
ARITHMETIC:
PART
2 encounter
in
the
aield
is
the
trace
aile
whose
response
The
second
relationship
you
need
to
understand
is
time
doesn’t
match
the
response
time
of
the
end
user’s
that
the
total
response
time
described
by
a
trace
aile
is
experience
that
you’re
trying
to
diagnose.
We
get
a
lot
simply
the
time
elapsed
from
the
beginning
of
the
airst
of
trace
ailes
whose
overall
response
times
are
call
to
the
end
of
the
ainal
call.
Remember
that
the
dominated
by
either
a
small
number
of
long-‐duration
Oracle
kernel
doesn’t
emit
call
begin
times—only
call
SQL*Net
message
from
client
calls
or
a
small
number
of
end
times.
But
you
can
compute
the
begin
time
of
a
call
unaccounted-‐for
gaps
in
the
action.
The
most
by
subtracting
its
duration
from
its
end
time: important
thing
to
remember
about
collecting
trace
data
is
you
want
the
response
time
of
your
trace
aile
to
(
R = timend − timbegin − ebegin
) (2) exactly
match
the
response
time
of
your
end
user’s
experience.
Note
that
although
Equation
2
refers
to
the
duration
of
Oracle
microseconds.
A
microsecond
is
the
airst
call
as
e,
if
the
airst
call
in
the
aile
is
an
OS
call,
1/1,000,000th
of
a
second,
or
1,000
nanoseconds.
It
you’ll
need
to
use
its
ela
aield.
may
surprise
you
to
learn
that,
on
some
platforms,
an
Be
aware
that
the
values
timbegin
and
ebegin
refer
to
Oracle
microsecond
is
1,024
nanoseconds,
or
aields
associated
with
the
airst
call
to
begin
in
the
1/976,563th
of
a
second.
Being
off
by
2.4%
may
not
process
being
traced.
Because
the
Oracle
kernel
emits
sound
like
too
big
of
a
problem,
but
if
you
want
to
trace
lines
when
calls
end
(not
when
they
begin),
the
regard
an
Oracle
tim
value
as
a
number
of
airst
call
to
begin
is
not
necessarily
the
airst
call
listed
microseconds
that
have
elapsed
since
the
Unix
epoch
in
the
trace
aile. (1970-‐01-‐01T00:00:00.000000Z
in
ISO
8601
form),
you
need
to
multiply
your
tim
value
by
1.024
before
calculating
the
date
and
time
it
represents.
Otherwise,
for
tim
values
generated
in
2011,
you
will
be
off
by
almost
a
year.
©
2011
Method
R
Corporation.
All
rights
reserved.
11
Oracle
bugs.
The
Oracle
11.1
era
has
not
been
kind
to
mrskew
trace
aile
users.
Bug
7522002
causes
database
call
time
The
Method
R
skew
analyzer
is
a
data-‐mining
tool
values
to
run
off
a
1,024-‐nanosecond-‐per-‐microsecond
for
trace
ailes.
It
can
do
nearly
everything
the
clock
and
OS
call
time
values
to
run
off
a
1,000-‐ Proailer
can
do,
and
more.
With
mrskew,
you
can
nanosecond-‐per-‐microsecond
clock.
This
causes
the
group
by
pretty
much
anything
in
a
trace
aile
to
sequence
of
calls
in
a
trace
aile
to
zigzag
back
and
forth
drill
with
practically
any
analysis
perspective
you
in
time.
This
problem
is
correctible,
but
then
bug
want.
For
example,
you
can
group
a
whole
8342329
isn’t.11
It
causes
the
Oracle
kernel
to
emit
the
directory
full
of
trace
ailes
by
SQL
statement
hash
same
tim
value
repeatedly
for
multiple
distinct
values,
or
database
aile
ids,
or
hash
latch
address
database
calls,
which
is
debilitating.
Happily,
these
values,
or
library
cache
miss
counts,
or
block
bugs
in
11.1
have
patches
and
are
aixed
in
version
counts
per
read
call,
or
service-‐module-‐action
11.2.0.2.0. names,
or
prepare
call
durations,
…anything
you
like.
21 COMMERCIAL
TRACE
FILE
TOOLS
22 ACKNOWLEDGMENTS
There’s
generally
too
much
detail
in
a
trace
aile
to
look
at
all
at
once.
To
make
sense
out
of
what’s
there
Thank
you
to
Jeff
Holt,
Ken
Ferlita,
Harold
Palacio,
and
requires
software
assistance.
The
most
famous
trace
Ron
Crisco
at
Method
R
Corporation
for
their
help
in
aile
software
tool
of
all
is
Oracle
Corporation’s
tkprof
preparing
this
work,
and
to
Andrew
Zitelli
of
Thales
utility,
which
Oracle
ships
with
the
Oracle
Database
Raytheon
Company
for
sharing
his
research
with
us.
(all
releases,
all
editions).
Tkprof
aggregates
by
SQL
statement,
and
it
allows
you
to
sort
those
SQL
23 ABOUT
THE
AUTHOR
statements
in
its
output
report
by
any
of
several
criteria.
This
can
work
out
ok,
as
long
as: Cary
Millsap
is
the
founder
and
president
of
Method
R
Corporation,
a
small
business
that
builds
and
• You
care
about
inefaicient
SQL
more
than
you
care
optimizes
software
all
over
the
world
(http://method-‐
about
response
time
(which
is
often
a
mistake). r.com).
Cary
designs
and
writes
software
and
• You
sort
by
the
right
thing
educational
material.
He
is
the
author
of
Optimizing
(sort=prsela,exeela,fchela
is
almost
always
the
Oracle
Performance
(O’Reilly
2003),
for
which
he
and
right
thing). Method
R
colleague
Jeff
Holt
were
named
Oracle
Magazine’s
Authors
of
the
Year.
He
has
presented
at
• Your
problem
doesn’t
involve
parent-‐child
hundreds
of
conferences
and
courses
worldwide,
and
relationships
among
database
calls
(so-‐called
he
is
also
published
in
Communications
of
the
ACM.
recursive
SQL).
Cary
spent
the
1990s
as
a
consultant
and
leader
of
I
used
tkprof
extensively
for
the
airst
ten
years
of
my
consulting
teams
within
Oracle
Corporation.
In
1999,
career.
However,
I
spent
a
lot
of
time
looking
at
raw
Cary
resigned
as
vice
president
of
Oracle’s
System
trace
data,
too,
because
there’s
a
lot
of
information
Performance
Group
to
start
a
career
as
a
business
inside
a
trace
aile
that
tkprof
ignores,
and
the
format
of
owner.
Cary
is
an
Oracle
ACE
Director
and
a
founding
the
tkprof
output
is
not
particularly
friendly
to
my
partner
of
the
Oak
Table
Network,
an
informal
response
time
focus.
So,
I’ve
helped
to
design
and
association
of
“Oracle
scientists”
that
are
well
known
write
a
few
software
tools
in
the
past
ten
years,
throughout
the
Oracle
community.
Cary
blogs
at
including:
http://carymillsap.blogspot.com
and
tweets
at
http://
Method
R
Proailer twitter.com/CaryMillsap.
The
Method
R
Proailer
is
software
that
Jeff
Holt
and
I
wrote
about
in
our
book
Optimizing
Oracle
Performance
(O’Reilly
2003).
It
produces
an
HTML
report
that
unambiguously
explains
the
response
time
accounted
in
a
trace
aile,
no
matter
what
the
cause
(whether
SQL
or
not),
using
color
to
direct
your
attention.
11
See
also
patches
9415425
for
Oracle
11.1.0.7.1
on
Solaris
and
9941786
for
Oracle
11.1.0.7.4
on
Solaris.
©
2011
Method
R
Corporation.
All
rights
reserved.
12
24 APPENDIX:
“HELLO
WORLD”
TRACE
1. Trace file /opt/oracle/diag/rdbms/v11202/V11202/trace/V11202_ora_21089.trc
2. Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
3. With the Partitioning, OLAP, Data Mining and Real Application Testing options
4. ORACLE_HOME = /opt/oracle/product/11.2.0.2
5. System name: Linux
6. Node name: rhel01.dev.method-r.com
7. Release: 2.6.18-92.1.13.el5xen
8. Version: #1 SMP Thu Sep 4 04:20:55 EDT 2008
9. Machine: i686
10. VM name: Xen Version: 3.1 (PVM)
11. Instance name: V11202
12. Redo thread mounted by this instance: 1
13. Oracle process number: 30
14. Unix process pid: 21089, image:
[email protected] (TNS V1-V3)
15.
16.
17. *** 2011-01-10 13:33:22.746
18. *** SESSION ID:(19.1247) 2011-01-10 13:33:22.746
19. *** CLIENT ID:() 2011-01-10 13:33:22.746
20. *** SERVICE NAME:(SYS$USERS) 2011-01-10 13:33:22.746
21. *** MODULE NAME:(SQL*Plus) 2011-01-10 13:33:22.746
22. *** ACTION NAME:() 2011-01-10 13:33:22.746
23.
24. =====================
25. PARSING IN CURSOR #7285244 len=60 dep=0 uid=5 oct=47 lid=5 tim=1294688002745892 hv=1548041990 ad='3d51df50'
sqlid='31wf1v9f4ags6'
26. BEGIN dbms_monitor.session_trace_enable(binds=>true); END;
27. END OF STMT
28. EXEC #7285244:c=0,e=845,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=1294688002745889
29. WAIT #7285244: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1294688002746391
30. WAIT #7285244: nam='SQL*Net message from client' ela= 931 driver id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1294688002747354
31. CLOSE #7285244:c=0,e=55,dep=0,type=0,tim=1294688002747449
32. =====================
33. PARSING IN CURSOR #7285244 len=30 dep=0 uid=5 oct=3 lid=5 tim=1294688002747560 hv=1604528588 ad='3d526cd8'
sqlid='guthms1gu6afc'
34. select 'Hello world' from dual
35. END OF STMT
36. PARSE #7285244:c=0,e=70,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=1388734953,tim=1294688002747559
37. EXEC #7285244:c=0,e=112,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=1388734953,tim=1294688002747793
38. WAIT #7285244: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1294688002747865
39. FETCH #7285244:c=0,e=8,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=1388734953,tim=1294688002747910
40. STAT #7285244 id=1 cnt=1 pid=0 pos=1 obj=0 op='FAST DUAL (cr=0 pr=0 pw=0 time=4 us cost=2 size=0 card=1)'
41. WAIT #7285244: nam='SQL*Net message from client' ela= 375 driver id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1294688002748453
42. FETCH #7285244:c=0,e=1,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=1388734953,tim=1294688002748493
43. WAIT #7285244: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1294688002748520
44. WAIT #7285244: nam='SQL*Net message from client' ela= 1627 driver id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1294688002750168
45. XCTEND rlbk=0, rd_only=1, tim=1294688002750230
46. =====================
47. PARSING IN CURSOR #7386176 len=447 dep=1 uid=0 oct=2 lid=0 tim=1294688002750383 hv=1097020010 ad='3d7e77d4'
sqlid='f711myt0q6cma'
48. insert into sys.aud$( sessionid,entryid,statement,ntimestamp#, userid,userhost,terminal,action#,returncode, logoff
$lread,logoff$pread,logoff$lwrite,logoff$dead, logoff$time,comment$text,spare1,clientid,sessioncpu,proxy$sid,user$guid,
instance#,process#,auditid,dbid) values(:1,:2,:3,SYS_EXTRACT_UTC(SYSTIMESTAMP), :4,:5,:6,:7,:8, :9,:10,:11,:12,
cast(SYS_EXTRACT_UTC(systimestamp) as date),:13,:14,:15,:16,:17,:18, :19,:20,:21,:22)
49. END OF STMT
50. PARSE #7386176:c=0,e=93,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=0,tim=1294688002750382
51. BINDS #7386176:
52. Bind#0
53. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
54. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
55. kxsbbbfp=0070ac04 bln=22 avl=04 flg=05
56. value=63843
57. Bind#1
58. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
59. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
60. kxsbbbfp=0070abe0 bln=24 avl=02 flg=05
©
2011
Method
R
Corporation.
All
rights
reserved.
13
61. value=2
62. Bind#2
63. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
64. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
65. kxsbbbfp=0070abbc bln=24 avl=02 flg=05
66. value=1
67. Bind#3
68. oacdty=01 mxl=32(06) mxlc=00 mal=00 scl=00 pre=00
69. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
70. kxsbbbfp=006df248 bln=32 avl=06 flg=09
71. value="SYSTEM"
72. Bind#4
73. oacdty=01 mxl=32(23) mxlc=00 mal=00 scl=00 pre=00
74. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
75. kxsbbbfp=006df1c2 bln=32 avl=23 flg=09
76. value="rhel01.dev.method-r.com"
77. Bind#5
78. oacdty=01 mxl=32(05) mxlc=00 mal=00 scl=00 pre=00
79. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
80. kxsbbbfp=635ffd04 bln=32 avl=05 flg=09
81. value="pts/0"
82. Bind#6
83. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
84. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
85. kxsbbbfp=0070ab98 bln=24 avl=03 flg=05
86. value=101
87. Bind#7
88. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
89. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
90. kxsbbbfp=0070ab74 bln=24 avl=01 flg=05
91. value=0
92. Bind#8
93. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
94. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
95. kxsbbbfp=0070ab40 bln=24 avl=02 flg=05
96. value=44
97. Bind#9
98. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
99. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
100. kxsbbbfp=0070ab1c bln=24 avl=01 flg=05
101. value=0
102. Bind#10
103. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
104. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
105. kxsbbbfp=0070aaf8 bln=24 avl=02 flg=05
106. value=4
107. Bind#11
108. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
109. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
110. kxsbbbfp=0070aad4 bln=24 avl=01 flg=05
111. value=0
112. Bind#12
113. oacdty=01 mxl=32(00) mxlc=00 mal=00 scl=00 pre=00
114. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
115. kxsbbbfp=00000000 bln=32 avl=00 flg=09
116. Bind#13
117. oacdty=01 mxl=32(06) mxlc=00 mal=00 scl=00 pre=00
118. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
119. kxsbbbfp=635ffc98 bln=32 avl=06 flg=09
120. value="oracle"
121. Bind#14
122. oacdty=01 mxl=32(00) mxlc=00 mal=00 scl=00 pre=00
123. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
124. kxsbbbfp=00000000 bln=32 avl=00 flg=09
125. Bind#15
126. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
127. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
128. kxsbbbfp=0070aab0 bln=24 avl=02 flg=05
129. value=1
130. Bind#16
131. oacdty=02 mxl=22(00) mxlc=00 mal=00 scl=00 pre=00
132. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
©
2011
Method
R
Corporation.
All
rights
reserved.
14
133. kxsbbbfp=0070aa8c bln=24 avl=00 flg=05
134. Bind#17
135. oacdty=01 mxl=32(00) mxlc=00 mal=00 scl=00 pre=00
136. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
137. kxsbbbfp=00000000 bln=32 avl=00 flg=09
138. Bind#18
139. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
140. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
141. kxsbbbfp=0070aa58 bln=24 avl=01 flg=05
142. value=0
143. Bind#19
144. oacdty=01 mxl=32(05) mxlc=00 mal=00 scl=00 pre=00
145. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
146. kxsbbbfp=bfc1b840 bln=32 avl=05 flg=09
147. value="21089"
148. Bind#20
149. oacdty=01 mxl=32(00) mxlc=00 mal=00 scl=00 pre=00
150. oacflg=18 fl2=0001 frm=01 csi=178 siz=32 off=0
151. kxsbbbfp=00000000 bln=32 avl=00 flg=09
152. Bind#21
153. oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
154. oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
155. kxsbbbfp=0070a7f8 bln=24 avl=06 flg=05
156. value=518865609
157. EXEC #7386176:c=0,e=1733,p=0,cr=1,cu=2,mis=0,r=1,dep=1,og=4,plh=0,tim=1294688002752264
158. STAT #7386176 id=1 cnt=0 pid=0 pos=1 obj=0 op='LOAD TABLE CONVENTIONAL (cr=1 pr=0 pw=0 time=155 us)'
159. CLOSE #7386176:c=0,e=5,dep=1,type=0,tim=1294688002752341
160. WAIT #0: nam='log file sync' ela= 153 buffer#=5673 sync scn=1046841 p3=0 obj#=-1 tim=1294688002752632
161. CLOSE #7285244:c=0,e=9,dep=0,type=0,tim=1294688002752690
162. CLOSE #7248564:c=0,e=30,dep=0,type=0,tim=1294688002752740
©
2011
Method
R
Corporation.
All
rights
reserved.
15