| When viewing AWR report,
always check corresponding ADDM report for actionable
recommendations. ADDM is a self diagnostic engine designed from the experience of Oracle’s best tuning experts and makes specific performance recommendations. |
| REPORT NAME | SQL Script |
| Automatic Workload Repository Report | awrrpt.sql |
| Automatic Database Diagnostics Monitor Report | addmrpt.sql |
| ASH Report | ashrpt.sql |
| AWR Diff Periods Report | awrddrpt.sql |
| AWR Single SQL Statement Report | awrsqrpt.sql |
| AWR Global Report | awrgrpt.sql |
| AWR Global Diff Report | awrgdrpt.sql |
AWR Automated Snapshots
Oracle uses a scheduled job, GATHER_STATS_JOB, to collect AWR statistics. This job is created, and enabled automatically, when you create a new Oracle database. To see this job, use the DBA_SCHEDULER_JOBS view as seen in this example:
SELECT a.job_name,
a.enabled, c.window_name, c.schedule_name, c.start_date,
c.repeat_interval
FROM dba_scheduler_jobs a, dba_scheduler_wingroup_members b,
dba_scheduler_windows c
WHERE job_name='GATHER_STATS_JOB'
And a.schedule_name=b.window_group_name
And b.window_name=c.window_name;
You can disable this job using the dbms_scheduler.disable
procedure as seen in this example:
Exec
dbms_scheduler.disable('GATHER_STATS_JOB');
And you can enable the job using the dbms_scheduler.enable
procedure as seen in this example:
Exec
dbms_scheduler.enable('GATHER_STATS_JOB');
| DB Name | DB Id | Instance | Inst num | Startup Time | Release | RAC |
|---|---|---|---|---|---|---|
| FGUARD | 750434027 | FGUARD | 1 | 03-Jul-13 21:07 | 11.2.0.2.0 | NO |
| Host Name | Platform | CPUs | Cores | Sockets | Memory (GB) |
|---|---|---|---|---|---|
| atl-frauddb-04.fiservipo.com | Linux x86 64-bit | 16 | 8 | 2 | 11.72 |
| Snap Id | Snap Time | Sessions | Cursors/Session | |
|---|---|---|---|---|
| Begin Snap: | 20813 | 08-Jul-13 00:00:19 | 267 | 3.1 |
| End Snap: | 20854 | 09-Jul-13 15:54:14 | 278 | 3.6 |
| Elapsed: | 2,393.91 (mins) | |||
| DB Time: | 4,689.46 (mins) |
| Begin | End | |||
|---|---|---|---|---|
| Buffer Cache: | 1,520M | 1,344M | Std Block Size: | 8K |
| Shared Pool Size: | 1,120M | 1,296M | Log Buffer: | 8,632K |
| Per Second | Per Transaction | Per Exec | Per Call | |
|---|---|---|---|---|
| DB Time(s): | 2.0 | 0.9 | 0.02 | 0.02 |
| DB CPU(s): | 0.5 | 0.2 | 0.01 | 0.01 |
| Redo size: | 25,972.2 | 12,131.8 | ||
| Logical reads: | 9,444.6 | 4,411.6 | ||
| Block changes: | 144.7 | 67.6 | ||
| Physical reads: | 8,671.9 |
4,050.7 | ||
| Physical writes: | 2,641.5 | 1,233.9 | ||
| User calls: | 83.9 | 39.2 | ||
| Parses: | 30.7 | 14.3 | ||
| Hard parses: | 0.4 | 0.2 | ||
| W/A MB processed: | 4.6 | 2.1 | ||
| Logons: | 2.5 | 1.2 | ||
| Executes: | 88.6 | 41.4 | ||
| Rollbacks: | 0.0 | 0.0 | ||
| Transactions: | 2.1 |
DB time(s): It's the amount of time
oracle has spent performing database user calls. It doesn't
include background processes. From the system view, the DB Time
is the sum of system usage, which is the CPU usage plus any
system call to lower systems (storage, network, etc).Application
waits (latches, locks, dbms_lock.sleep,... ) are implemented as
system calls as well.
DB CPU(s): It's
the amount of CPU time spent on user calls. It doesn't include
background process. The value is in microseconds.
Here
are few important stats for a DBA to look into. Fist is "DB CPU(s)" per second.
Before that let's understand how DB CUP's work.
Suppose you have 12 cores into the system. So, per wall clock
second you have 12 seconds to work on CPU. So, if "DB
CPU(s)" per second
in this report > cores in (Host
Configuration (#2)) it means env is CPU bound and either need
more CPU's or need to further check is this happening all the
time or just for a fraction of time. As per my experience
there are very few cases, when system is CPU bound.
Redo size: This is the amount of DML happening in the DB. High redo figures mean that either lots of new data is being saved into the database, or existing data is undergoing lots of changes. For example, the table below shows that an average transaction generates about 12,000 bytes of redo data along with around 26,000 redo bytes per second.
Logical reads:
This is calculated as Consistent Gets + DB Block Gets
= Logical Reads. Logical reads is simply the number of
blocks read by the database, including physical (i.e. disk)
reads.
Block Changes: The number of
blocks modified during the sample interval. If you see an
increase here then more DML statements are taking place (meaning
your users are doing more INSERTs, UPDATEs, and DELETEs than
before).
Physical reads: The number of
requests for a block that caused a physical I/O.
Physical writes: Number of
physical writes performed
User calls: Indicates how many user calls
have occurred during the snapshot period. This value can give
you some indication if usage has increased. The user calls is the database
client requesting the server to to do something like login,
parse,etc while SQL Execute is executing the sql.
Depending on how the client is connecting, the numbers can be
higher or lower. In particular, when the database is
executing many times per a user call,
this could be an indication of excessive context switching (e.g.
a PL/SQL function in a SQL statement called too often because of
a bad plan). In such cases looking into “SQL ordered by
executions” will be the logical next step.
Parses: The total of all parses;
both hard and soft.
Hard Parses: Those parses requiring a
completely new parse of the SQL statement. A ‘hard parse’ rate of greater than 100 per
second indicates there is a very high amount of
hard parsing on the system. High hard parse rates cause serious
performance issues, and must be investigated. A high hard parse
rate is usually accompanied by latch contention on the shared
pool and library cache latches. Check whether waits for ‘latch
free’ appear in the top-5 wait events, and if so, examine the
latching sections of the report. Of course, we want a low number
here. Possible reasons for excessive hard parses may
be a small shared pool or may be that bind variables are not
being used.
As a rule of a thumb, anything below 1 hard parse per second is
probably okay, and everything above 100 per second suggests a
problem (if the database has a large number of CPUs, say, above
100, those numbers should be scaled up accordingly). It also
helps to look at the number of hard parses as % of executions
(especially if you’re in the grey zone).
If you suspect that excessive parsing is hurting your database’s
performance:
1) check “time model statistics” section (hard parse elapsed
time, parse time elapsed etc.)
2) see if there are any signs of library cache contention in the
top-5 events
3) see if CPU is an issue.
If that confirms your suspicions, then find the source of
excessive parsing (for soft parsing, use “SQL by parse calls”
Soft Parses: Not listed but
derived by subtracting the hard parses from parses. A soft
parse reuses a previous hard parse and hence consumes far fewer
resources. A high soft parse rate
could be anywhere in the rate of 300 or more per second.
Unnecessary soft parses also limit application scalability;
optimally a SQL statement should be soft-parsed once per
session, and executed many times.
Sorts: Number of sorts
occurring in the database. Establishing a new database
connection is also expensive (and even more expensive in case
of audit or triggers). If you suspect that high number of
logons is degrading your performance, check “connection
management elapsed time” in “Time model statistics”.
Logons: No of logons during the
interval.
Executes: how many statements we
are executing per second / transaction
Transactions: How many
transactions per second we process.
Logical and Physical Reads combined
shows measure of how many I/O the DB is performing. If this is
too high, go to section “SQL by Logical Reads” or “SQL by
Physical Reads”
Next stat to look at are Parses and Hard parses. If the ratio of hard parse to parse is high, this means Database is performing more hard parse. So, needs to look at parameters like cursor_sharing and application level for bind variables etc.
| Buffer Nowait %: | 100.00 | Redo NoWait %: | 100.00 |
| Buffer Hit %: | 99.32 | In-memory Sort %: | 100.00 |
| Library Hit %: | 98.94 | Soft Parse %: | 97.25 |
| Execute to Parse %: | 75.00 | Latch Hit %: | 98.78 |
| Parse CPU to Parse Elapsd %: | 22.99 | % Non-Parse CPU: | 99.93 |
init.ora parameter cursor_sharing.(parse time CPU) / (parse time elapsed)
A low value for this ratio could mean that the non-CPU-related
parse time was spent waiting for latches, which might indicate a
parsing or latching problem. To investigate further, look at the
shared-pool and library-cache latches in the Latch sections of the
report for indications of contention on these latches.
Latch Hit Ratio. This is the ratio of the total number of
latch misses to the number of latch gets for all latches. A low
value for this ratio indicates a latching problem, whereas a high
value is generally good. However, as the data is rolled up over
all latches, a high latch hit ratio can artificially mask a low
get rate on a specific latch. Cross-check this value with the Top
5 Wait Events to see if latch free is in the list, and refer to
the Latch sections of the report. Latch Hit % of less than 99
percent is usually a big problem.
Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer
Nowait %: 99.99
Redo NoWait %: 100.00
Buffer
Hit %: 95.57 In-memory
Sort %: 97.55
Library
Hit %:
99.89 Soft Parse
%: 99.72
Execute to Parse %: 88.75
Latch Hit %: 99.11
Parse CPU to Parse Elapsd %:
52.66 % Non-Parse CPU: 99.99
Interpreting the ratios in this section can be slightly more
complex than it may seem at first glance. While high values for
the ratios are generally good (indicating high efficiency), such
values can be misleading your system may be doing something
efficiently that it would be better off not doing at all.
Similarly, low values aren't always bad. For example, a low
in-memory sort ratio (indicating a low percentage of sorts
performed in memory) would not necessarily be a cause for concern
in a decision- support system (DSS) environment, where user
response time is less critical than in an online transaction
processing (OLTP) environment.
Basically, you need to keep in mind the characteristics of your
application - whether it is query-intensive or update-intensive,
whether it involves lots of sorting, and so on - when you're
evaluating the Instance Efficiency Percentages.
The following ratios should be above 90% in a database.
Buffer Nowait
Buffer Hit
Library Hit
Redo NoWait
In-memory Sort
Soft Parse
Latch Hit
Non-Parse CPU
The execute to parse ratio should be very high in a ideal
database.
The execute to parse ratio is basically a measure between
the number of times a sql is executed versus the number of times
it is parsed.
The ratio will move higher as the number of executes go up, while
the number of parses either go down or remain the same.
The ratio will be close to zero if the number of executes and
parses are almost equal.
The ratio will be negative executes are lower but the parses are
higher.
Another Sample Analysis
Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer
Nowait %: 98.56 Redo
NoWait %: 100.00
Buffer
Hit %: 99.96 In-memory Sort
%: 99.84
Library Hit
%: 99.99
Soft Parse %: 100.00 (A)
Execute to
Parse %: 0.10 (A)
Latch Hit %: 99.37
Parse CPU to Parse Elapsd
%: 58.19 (A) % Non-Parse
CPU: 99.84
Shared Pool
Statistics
Begin End
------ ------
Memory Usage %:
28.80 29.04 (B)
% SQL with executions>1:
75.91 76.03
% Memory for SQL w/exec>1: 83.65
84.09
Observations:
• The 100% soft parse ratio (A)
indicates the system is not hard-parsing. However the system is
soft parsing a lot, rather than only re-binding and re-executing
the same cursors, as the Execute to Parse % is very low (A). Also, the CPU time used for
parsing (A) is
only 58% of the total elapsed parse time (see Parse CPU to Parse
Elapsd). This may also imply some resource contention during
parsing (possibly related to the latch free event?).
• There seems to be a lot of unused memory in the shared pool
(only 29% is used) (B). If there is insufficient memory
allocated to other areas of the database (or OS), this memory
could be redeployed
***Please see the following NOTES on
shared pool issues
[NOTE:146599.1] Diagnosing and Resolving
Error ORA-04031
[NOTE:62143.1] Understanding and Tuning the
Shared Pool
[NOTE:105813.1] SCRIPT TO SUGGEST MINIMUM
SHARED POOL SIZE
Top 10
Foreground Events by Total Wait Time
This section provides insight into what events the Oracle database
is spending most of it's time on (see wait events). Each wait
event is listed, along with the number of waits, the time waited
(in seconds), the average wait per event (in microseconds) and the
associated wait class.
This is one of the most important sections of the report.
| Event | Waits |
Total Wait Time (sec) | Wait Avg (ms) | % DB time | Wait Class |
|---|---|---|---|---|---|
| PX Deq: Slave Session Stats | 912,927 | 3006.7 | 3 |
99.4 | Other |
| DB CPU | 70,609 | 64.84 | |||
| log file sync | 247,094 | 6,933 | 28 | 2.46 | Commit |
| db file sequential read | 221,301 | 5,813 | 26 | 2.07 | User I/O |
| library cache: mutex X | 27,915 | 57.9 | 2 | 1.9 | Concurrency |
If you turn off the statistic parameter, then the Time(s) wont
appear. Wait analysis should be done with respect to Time(s) as
there could be million of waits but if that happens for a second
or so then who cares. Therefore, time is very important component.
When you are trying
to eliminate bottlenecks on your system, your report's Top 10
Timed Events section is the first place to look and you should
use the HIGHEST WAIT TIMES to guide the investigation.
Here, first
of all check for wait class if wait
class is User I/O , System I/O, Others etc this
could be fine but if wait class has value "Concurrency" then
there could be some serious problem.
Next to look at is Total Wait Time (s) which show
how many times DB was waiting in this class and then Wait Avg (ms). If Total Wait Time(s) are high
but Wait
Avg (ms) is low then
you can ignore this. If both are high or Wait Avg (ms) is high then
this has to further investigate.
Here, first
check if Wait Class. If their values are in User
I/O , System I/O, Others this could be fine. But if wait
class has value "Concurrency" then there could be some serious
problem.
Next to look at is Total Wait Time (s) which
show how many times DB was waiting in this class and then Wait
Avg (ms).
If Total Wait Time(s) are high but Wait Avg
(ms) is low then you can ignore this.
If both
are high or Wait Avg (ms) is high then this
has to further investigate.
In the above screen shot, most of the resource are taken by DB
CPU = 64% DB time. Taking resource by DB CPU is a normal
situation.
As you will see, you have several different types of waits, so
let's discuss the most common waits on the next section.
Wait Classes by Total Wait Time
| Wait Class | Waits | Total Wait Time (sec) | Avg Wait (ms) | % DB time | Avg Active Sessions |
|---|---|---|---|---|---|
| Other | 5,081,996 | 2,851 | 1 | 84.2 | 0.4 |
| DB CPU | 1,223 | 36.1 | 0.2 | ||
| Cluster | 246,728 | 661 | 3 | 19.5 | 0.1 |
| User I/O | 226,368 | 425 | 2 | 12.6 | 0.1 |
| Scheduler | 51,051 | 94 | 2 | 2.8 | 0.0 |
| Commit | 61,242 | 60 | 1 | 1.8 | 0.0 |
| Concurrency | 103,675 | 43 | 0 | 1.3 | 0.0 |
| System I/O | 210,905 | 30 | 0 | .9 | 0.0 |
| Network | 1,599,588 | 23 | 0 | .7 | 0.0 |
| Application | 3,073 | 1 | 0 | .0 | 0.0 |
| Configuration | 46 | 0 | 2 | .0 | 0.0 |
Host CPU
| CPUs | Cores | Sockets | Load Average Begin | Load Average End | %User | %System | %WIO | %Idle |
|---|---|---|---|---|---|---|---|---|
| 20 | 20 | 2 | 0.9 | 0.2 | 98.9 |
Instance CPU
| %Total CPU | %Busy CPU | %DB time waiting for CPU (Resource Manager) |
|---|---|---|
| 0.9 | 82.9 | 2.1 |
IO Profile
| Read+Write Per Second | Read per Second | Write Per Second | |
|---|---|---|---|
| Total Requests: | 71.0 | 47.6 | 23.4 |
| Database Requests: | 44.8 | 41.1 | 3.7 |
| Optimized Requests: | 0.0 | 0.0 | 0.0 |
| Redo Requests: | 16.5 | 0.1 | 16.4 |
| Total (MB): | 1.2 | 1.0 | 0.2 |
| Database (MB): | 0.9 | 0.9 | 0.0 |
| Optimized Total (MB): | 0.0 | 0.0 | 0.0 |
| Redo (MB): | 0.1 | 0.0 | 0.0 |
| Database (blocks): | 117.7 | 112.0 | 5.7 |
| Via Buffer Cache (blocks): | 71.6 | 67.3 | 4.4 |
| Direct (blocks): | 46.0 | 44.7 | 1.3 |
Memory Statistics
| |
Begin | End |
|---|---|---|
| Host Mem (MB): | 32,643.8 | 32,643.8 |
| SGA use (MB): | 16,384.0 | 16,384.0 |
| PGA use (MB): | 2,500.9 | 2,505.5 |
| % Host Mem used for SGA+PGA: | 57.85 | 57.87 |
Cache Sizes
| Begin | End | |||
|---|---|---|---|---|
| Buffer Cache: | 7,168M | 7,168M | Std Block Size: | 8K |
| Shared Pool Size: | 8,301M | 8,298M | Log Buffer: | 21,148K |
| Begin | End | |
|---|---|---|
| Memory Usage %: | 87.72 | 87.54 |
| % SQL with executions>1: | 83.65 | 83.33 |
| % Memory for SQL w/exec>1: | 78.30 | 80.36 |
| Begin | End | |
|---|---|---|
| Memory Usage %: | 73.86 | 75.42 |
| % SQL with executions>1: | 92.61 | 93.44 |
| % Memory for SQL w/exec>1: | 94.33 | 94.98 |
Shared Pool
Statistics
Begin End
------ ------
Memory
Usage
%:
42.07
43.53
% SQL with executions>1:
73.79 75.08
% Memory for SQL w/exec>1:
76.93 77.64
Memory Usage % = It's the shared pool usage. So here we
have use 73.86 per cent of our shared pool and out of that almost
94 percent is being re-used. If Memory Usage % is too large like
90 % it could mean that your shared pool is tool small and if the
percent is in 50 for example then this could mean that you shared
pool is too large. In general, Memory usage % statistics should be
~70% after the DB has been running a long time. If its quite low,
memory is being wasted.
% SQL with executions>1 = Shows % of SQLs executed
more than 1 time. The % should be very near to value 100. If we
get a low number here, then the DB is not using shared SQL
statements. May be because bind variables are not being used.
% memory for SQL w/exec>1: From the memory space
allocated to cursors, shows which % has been used by cursors more
than 1.
The values should not be very high (preferably less than 75%).
If you want a quick instance wide wait event status, showing which events are the biggest contributors to total wait time, you can use the following query :
select event, total_waits,time_waited from
V$system_event
where event NOT IN
('pmon timer',
'smon timer', 'rdbms ipc reply', 'parallel deque wait',
'virtual circuit',
'%SQL*Net%', 'client message', 'NULL event')
order by time_waited desc;
EVENT
TOTAL_WAITS
TIME_WAITED
------------------------
-------------
-------------
db file sequential
read
35051309
15965640
latch
free
1373973
1913357
db file scattered
read
2958367
1840810
enqueue
2837
370871
buffer busy
waits
444743
252664
log file parallel
write
146221
123435
That generally happens during a full scan of a table or Fast
Full Index Scans. As
full table scans are pulled into memory, they rarely fall
into contiguous buffers but instead are scattered throughout
the buffer cache. A large number here indicates that your
table may have missing indexes, statistics are not updated
or your indexes are not used. Although it may be more
efficient in your situation to perform a full table scan
than an index scan, check to ensure that full table scans
are necessary when you see these waits. Try to cache small
tables to avoid reading them in over and over again, since a
full table scan is put at the cold end of the LRU (Least
Recently Used) list. You
can use the report to help identify the query in question
and fix it.
The init.ora
parameter db_file_multiblock_read_count
specifies the maximum numbers of blocks read in that way.
Typically, this parameter should have values of 4-16 independent
of the size of the database but with higher values needed with
smaller Oracle block sizes. If you have a high wait time for
this event, you either need to reduce the cost of I/O, e.g. by
getting faster disks or by distributing your I/O load better, or
you need to reduce the amount of full table scans by tuning SQL
statements. The appearance of the‘db file scattered read’ and ‘db file sequential read’events
may not necessarily indicate a problem, as IO is a normal
activity on a healthy instance. However, they can indicate
problems if any of the following circumstances are true:
• The data-access method is bad (that is, the SQL statements are
poorly tuned), resulting in unnecessary or inefficient IO
operations
• The IO system is overloaded and performing poorly
• The IO system is under-configured for the load
• IO operations are taking too long
If this Wait Event is a significant
portion of Wait Time then a number of approaches are possible:
o Find which SQL statements perform Full Table or Fast Full
Index scans and tune them to make sure these scans are necessary
and not the result of a suboptimal plan.
- The view V$SQL_PLAN view can help:
For Full Table scans:
select sql_text from
v$sqltext t, v$sql_plan p
where
t.hash_value=p.hash_value
and p.operation='TABLE ACCESS'
and
p.options='FULL'
order by
p.hash_value, t.piece;
For Fast Full Index scans:
select sql_text from
v$sqltext t, v$sql_plan p
where
t.hash_value=p.hash_value
and p.operation='INDEX'
and
p.options='FULL SCAN'
order by
p.hash_value, t.piece;
o In cases where such multiblock scans
occur from optimal execution plans it is possible to tune the
size of multiblock I/Os issued by Oracle by setting the instance
parameter DB_FILE_MULTIBLOCK_READ_COUNT so that:
DB_BLOCK_SIZE x DB_FILE_MULTIBLOCK_READ_COUNT = max_io_size of
system
Query tuning should be used to optimize online SQL to use
indexes.
2. DB File Sequential Read.
Is the wait
that comes from the physical side of the database. It related
to memory starvation and non selective index use. Sequential
read is an index read followed by table read because it is
doing index lookups which tells exactly which block to go to.
This could indicate poor
joining order of tables or un-selective indexes in your
SQL or waiting for writes to TEMP space (direct loads,
Parallel DML (PDML) such as parallel updates. It could mean that a lot of index reads/scans
are going on. Depending on the problem it may help to tune
PGA_AGGREGATE_TARGET and/or DB_CACHE_SIZE.
The
sequential read event identifies Oracle reading blocks
sequentially, i.e. one after each other. It is normal for this
number to be large for a high-transaction, well-tuned system,
but it can indicate problems in some circumstances. You should
correlate this wait statistic with other known issues within the
report, such as inefficient SQL. Check to ensure that index
scans are necessary, and check join orders for multiple table
joins. The DB_CACHE_SIZE will also be a determining factor in
how often these waits show up. Problematic hash-area joins
should show up in the PGA memory, but they're also memory hogs
that could cause high wait numbers for sequential reads. They
can also show up as direct path read/write waits. These
circumstances are usually interrelated. When they occur in
conjunction with the appearance of the 'db file scattered read' and 'db file sequential read' in
the Top 5 Wait Events section, first you should examine the SQL
Ordered by Physical Reads section of the report, to see if it
might be helpful to tune the statements with the highest resource
usage.
It could be because the indexes are fragmented. If that is the
case, rebuilding the index will compact it and will produce to
visit less blocks.
Then, to determine whether there is a potential I/O bottleneck,
examine the OS I/O statistics for corresponding symptoms. Also
look at the average time per read in the Tablespace and File I/O
sections of the report. If many I/O-related events appear high in
the Wait Events list, re-examine the host hardware for disk
bottlenecks and check the host-hardware statistics for indications
that a disk reconfiguration may be of benefit.
Block reads are fairly inevitable so the aim should be to minimize
unnecessary I/O. I/O for sequential reads can be reduced by tuning
SQL calls that result in full table scans and using the
partitioning option for large tables.
3. Free Buffer Waits.
When a session needs a free buffer and cannot find one, it will
post the database writer process asking it to flush dirty blocks
(No place to put a new block). Waits in this category may
indicate that you need to increase
the DB_BUFFER_CACHE, if all your SQL is tuned. Free
buffer waits could also indicate that unselective SQL is causing
data to flood the buffer cache with index blocks, leaving none
for this particular statement that is waiting for the system to
process. This normally indicates that there is a substantial
amount of DML (insert/update/delete) being done and that the
Database Writer (DBWR) is not writing quickly enough; the buffer
cache could be full of multiple versions of the same buffer,
causing great inefficiency. To address this, you may want to
consider accelerating
incremental checkpointing, using more DBWR processes,
or increasing the number of physical disks. To investigate if
this is an I/O problem, look at the report I/O Statistics.
Increase the DB_CACHE_SIZE; shorten the checkpoint; tune the
code to get less dirty blocks, faster I/O, use multiple DBWR’s.
4. Buffer Busy Waits. A buffer busy wait happens when multiple
processes concurrently want to modify the same block in the
buffer cache. This typically happens during massive parallel
inserts if your tables do not have free lists and it can happen
if you have too few rollback segments. Buffer busy waits should not be greater than 1 percent.
Check the Buffer Wait Statistics section (or V$WAITSTAT) to find
out if the wait is on a segment header. If this is the case,
increase the freelist groups or increase the pctused to pctfree
gap. If the wait is on an undo header, you can address this by
adding rollback segments; if it's on an undo block, you need to
reduce the data density on the table driving this consistent
read or increase the DB_CACHE_SIZE. If the wait is on a data
block, you can move data to another block to avoid this hot
block, increase the freelists on the table, or use Locally
Managed Tablespaces (LMTs). If it's on an index block, you
should rebuild the index, partition the index, or use a reverse
key index. To prevent buffer busy waits related to data blocks,
you can also use a smaller block size: fewer records fall within
a single block in this case, so it's not as "hot." When a DML
(insert/update/ delete) occurs, Oracle writes information into
the block, including all users who are "interested" in the state
of the block (Interested Transaction List, ITL). To decrease
waits in this area, you can increase the initrans, which will
create the space in the block to allow multiple ITL slots. You
can also increase the pctfree on the table where this block
exists (this writes the ITL information up to the number
specified by maxtrans, when there are not enough slots built
with the initrans that is specified). Buffer busy waits can be
reduced by using reverse-key indexes for busy indexes and by
partitioning busy tables.
Buffer Busy Wait on Segment
Header – Add freelists (if inserts) or freelist groups
(esp. RAC). Use ASSM.
Buffer Busy Wait on Data
Block – Separate ‘hot’ data; potentially use reverse key
indexes; fix queries to reduce the blocks popularity, use
smaller blocks, I/O, Increase initrans and/or maxtrans (this
one’s debatable). Reduce records per block
Buffer Busy Wait on
Undo Header – Add rollback segments or increase size of
segment area (auto undo)
Buffer Busy Wait on
Undo block – Commit more (not too much) Larger rollback
segments/area. Try to fix the SQL.
5. Latch Free. Latches are
low-level queuing mechanisms (they're accurately referred to as
mutual exclusion mechanisms) used to protect shared memory
structures in the system global area (SGA). Latches are like
locks on memory that are very quickly obtained and released.
Latches are used to prevent concurrent access to a shared memory
structure. If the latch is not available, a latch free miss is
recorded. Most latch problems are related to the failure to use
bind variables (library cache latch), redo generation issues
(redo allocation latch), buffer cache contention issues (cache
buffers LRU chain), and hot blocks in the buffer cache (cache
buffers chain). There are also latch waits related to bugs;
check MetaLink for bug reports if you suspect this is the case.
When latch miss ratios are greater than 0.5 percent, you should
investigate the issue. If
latch free waits are in the Top 5 Wait Events or high in the
complete Wait Events list, look at the latch-specific sections of
the report to see which latches are contended for.
6. Enqueue. An enqueue is a lock that protects a shared
resource. Locks protect shared resources, such as data in a
record, to prevent two people from updating the same data at the
same time application, e.g. when a select for update is
executed.. An enqueue includes a queuing mechanism, which is
FIFO (first in, first out). Note that Oracle's latching
mechanism is not FIFO. Enqueue waits usually point to the ST
enqueue, the HW enqueue, the TX4 enqueue, and the TM enqueue.
The ST enqueue is used for space management and allocation for
dictionary-managed tablespaces. Use LMTs, or try to preallocate
extents or at least make the next extent larger for problematic
dictionary-managed tablespaces. HW enqueues are used with the
high-water mark of a segment; manually allocating the extents
can circumvent this wait. TX4s are the most common enqueue
waits. TX4 enqueue waits are usually the result of one of three
issues. The first issue is duplicates in a unique index; you
need to commit/rollback to free the enqueue. The second is
multiple updates to the same bitmap index fragment. Since a
single bitmap fragment may contain multiple rowids, you need to
issue a commit or rollback to free the enqueue when multiple
users are trying to update the same fragment. The third and most
likely issue is when multiple
users are updating the same block. If there are no free
ITL slots, a block-level lock could occur. You can easily avoid
this scenario by increasing the initrans and/or maxtrans to
allow multiple ITL slots and/or by increasing the pctfree on the
table. Finally, TM enqueues occur during DML to prevent DDL to
the affected object. If you have foreign keys, be sure to index them to avoid
this general locking issue.
Enqueue - ST
Use LMT’s or pre-allocate large extents
Enqueue - HW
Pre-allocate extents above HW (high water mark.)
Enqueue – TX
Increase initrans and/or maxtrans (TX4) on (transaction) the
table or index. Fix locking issues if TX6. Bitmap
(TX4) & Duplicates in Index (TX4).
Enqueue - TM
Index foreign keys; Check application (trans. mgmt.) locking of
tables. DML Locks.
7. Log Buffer Space
Look at increasing log buffer size. This wait occurs because you
are writing the log buffer faster than LGWR can write it to the
redo logs, or because log
switches are too slow. To address this problem,
increase the size of the redo log files, or increase the size of
the log buffer, or get faster disks to write to. You might even
consider using solid-state disks, for their high speed.
The session is waiting for space in the log
buffer. (Space becomes available only after LGWR has written the
current contents of the log buffer to disk.) This typically
happens when applications generate redo faster than LGWR can
write it to disk.
8. Log File Switch
log file switch (checkpoint incomplete): May indicate excessive
db files or slow IO subsystem
log file switch (archiving needed): Indicates archive
files are written too slowly
log file switch completion: May need more log files per
May indicate excessive db files or slow IO subsystem. All commit
requests are waiting for "logfile switch (archiving needed)" or
"logfile switch (chkpt. Incomplete)." Ensure that the archive
disk is not full or slow. DBWR may be too slow because of I/O.
You may need to add more or larger redo logs, and you may
potentially need to add database writers if the DBWR is the
problem.
9. Log File Sync
Could indicate excessive commits. A Log File Sync happens each
time a commit (or rollback) takes place. If there are a lot of
waits in this area then you may want to examine your application
to see if you are committing too frequently (or at least more
than you need to). When a user commits or rolls back data, the
LGWR flushes the session's redo from the log buffer to the redo
logs. The log file sync process must wait for this to
successfully complete. To reduce wait events here, try to commit
more records (try to commit a
batch of 50 instead of one at a time, use BULKS, , for example).
Put redo logs on a faster disk, or alternate redo logs on
different physical disks (with no other DB Files, ASM, etc) to
reduce the archiving effect on LGWR. Don't use RAID 5, since it
is very slow for applications that write a lot; potentially
consider using file system direct I/O or raw devices, which are
very fast at writing information. The associated event, ‘log
buffer parallel write’ is used by the redo log writer process,
and it will indicate if your actual problem is with the log file
I/O. Large wait times for this event can also be caused by
having too few CPU resources available for the redolog writer
process.
10. Idle Event. There are several idle wait events listed
after the output; you can ignore them. Idle events are generally
listed at the bottom of each section and include such things as
SQL*Net message to/from client and other background-related
timings. Idle events are listed in the stats$idle_event table.
11. global
cache
cr request: (OPS) This wait event shows the amount of
time that an instance has waited for a requested data block for
a consistent read and the transferred block has not yet arrived
at the requesting instance. See Note 157766.1 'Sessions Wait
Forever for 'global cache cr request' Wait Event in OPS or RAC'.
In some cases the 'global cache cr request' wait event may be
perfectly normal if large buffer caches are used and the same
data is being accessed concurrently on multiple instances.
In a perfectly tuned, non-OPS/RAC database, I/O wait events
would be the top wait events but since we are avoiding I/O's
with RAC and OPS the 'global cache cr request' wait event often
takes the place of I/O wait events.
12.
library cache pin: Library cache
latch contention may be caused by not using bind variables. It
is due to excessive parsing of SQL statement.
The session wants to pin an object in
memory in the library cache for examination, ensuring no other
processes can update the object at the same time. This happens
when you are compiling or parsing a PL/SQL object or a view.
13. CPU
time
This is not really a wait event (hence, the new name), but
rather the sum of the CPU used by this session, or the amount
of CPU time used during the snapshot window. In a heavily
loaded system, if the CPU time event is the biggest event,
that could point to some CPU-intensive processing (for
example, forcing the use of an index when a full scan should
have been used), which could be the cause of the bottleneck.
When CPU Other is a significant component of total Response
Time the next step is to find the SQL statements that access
the most blocks. Block accesses are also known as Buffer Gets
and Logical I/Os. The report lists such SQL statements in
section SQL ordered by Gets.
14. DB File Parallel
Read If you are doing a lot of partition
activity then expect to see that wait even. it could be a
table or index partition. This Wait Event is used when Oracle
performs in parallel reads from multiple datafiles to
non-contiguous buffers in memory (PGA or Buffer Cache). This
is done during recovery operations or when buffer prefetching
is being used as an optimization i.e. instead of performing
multiple single-block reads. If this wait is an important
component of Wait Time, follow the same guidelines as 'db file
sequential read'.
This may occur during
recovery or during regular activity when a session batches
many single block I/O requests together and issues them in
parallel.
15. PX qref latch
Can often mean that the Producers are producing data quicker
than the Consumers can consume it. Maybe we could increase
parallel_execution_message_size to try to eliminate some of
these waits or we might decrease the degree of parallelism. If
the system workload is high consider to decrease the degree of
parallelism. If you have DEFAULT parallelism on your
object you can decrease the value of
PARALLEL_THREADS_PER_CPU. Have in mind DEFAULT
degree = PARALLEL_THREADS_PER_CPU * #CPU's
16. Log File Parallel
Write. It occurs when waiting for writes of REDO
records to the REDO log files to complete. The wait occurs in
log writer (LGWR) as part of normal activity of copying
records from the REDO log buffer to the current online log.
The actual wait time is the time taken for all the outstanding
I/O requests to complete. Even though the writes may be issued
in parallel, LGWR needs to wait for the last I/O to be on disk
before the parallel write is considered complete. Hence the
wait time depends on the time it takes the OS to complete all
requests.
Log file parallel write waits can be reduced by moving log
files to the faster disks and/or separate disks where there
will be less contention.
17. SQL*Net more data to
client
This means the instance is sending a lot of data to the
client. You can decrease this time by having the client bring
back less data. Maybe the application doesn't need to bring
back as much data as it is.
18. SQL*Net message to
client
The “SQL*Net message to client” Oracle metric indicates the
server (foreground process) is sending a message to the
client, and it can be used to identify throughput issues over
a network, especially distributed databases with slow database
links. The SQL*Net more data to client event happens when
Oracle writes multiple data buffers (sized per SDU) in a
single logical network call.
19. enq: TX - row lock
contention:
Oracle keeps data consistency with the help of locking
mechanism. When a particular row is being modified by the
process, either through Update/ Delete or Insert operation,
oracle tries to acquire lock on that row. Only when the
process has acquired lock the process can modify the row
otherwise the process waits for the lock. This wait situation
triggers this event. The lock is released whenever a COMMIT is
issued by the process which has acquired lock for the row.
Once the lock is released, processes waiting on this event can
acquire lock on the row and perform DML operation
StatisticNameTime(s) %ofDBTime
------------------------------------------ ------------------ ------------
sqlexecuteelapsedtime1,247.7 95.5
DB CPU 129.9 9.9
connectionmanagement call elapsedtime5.5 .4
parsetimeelapsed 4.2 .3
hard parse elapsedtime3.7 .3
PL/SQL execution elapsedtime1.2 .1
PL/SQL compilation elapsedtime0.4 .0
hard parse (sharing criteria) elapsedtime0.1 .0
repeated bind elapsedtime0.0 .0
hard parse (bind mismatch) elapsedtime0.0 .0
sequenceloadelapsedtime0.0 .0
failed parse elapsedtime0.0 .0
DBtime1,306.8
background elapsedtime3,395.9
background cputime19.6
-------------------------------------------------------------
| Statistic Name | Time (s) | % of DB Time |
|---|---|---|
| sql execute elapsed time | 19,640.87 | 95.41 |
| DB CPU | 17,767.20 | 86.31 |
| parse time elapsed | 73.75 | 0.36 |
| hard parse elapsed time | 38.35 | 0.19 |
| PL/SQL execution elapsed time | 32.04 | 0.16 |
| hard parse (sharing criteria) elapsed time | 6.98 | 0.03 |
| connection management call elapsed time | 4.25 | 0.02 |
| repeated bind elapsed time | 3.43 | 0.02 |
| PL/SQL compilation elapsed time | 3.04 | 0.01 |
| hard parse (bind mismatch) elapsed time | 1.62 | 0.01 |
| sequence load elapsed time | 0.74 | 0.00 |
| failed parse elapsed time | 0.04 | 0.00 |
| DB time | 20,586.08 | |
| background elapsed time | 859.22 | |
| background cpu time | 68.05 |
Another
Example
|
Statistic Name |
Time (s) |
% of DB Time |
|
sql execute elapsed time |
12,416.14 |
86.45 |
|
DB CPU |
9,223.70 |
64.22 |
|
parse time elapsed |
935.61 |
6.51 |
|
hard parse elapsed time |
884.73 |
6.16 |
|
failed parse elapsed time |
821.39 |
5.72 |
|
PL/SQL execution elapsed time |
153.51 |
1.07 |
|
hard parse (sharing criteria) elapsed
time |
25.96 |
0.18 |
|
connection management call elapsed time |
14.00 |
0.10 |
|
hard parse (bind mismatch) elapsed time |
4.74 |
0.03 |
|
PL/SQL compilation elapsed time |
1.20 |
0.01 |
|
repeated bind elapsed time |
0.22 |
0.00 |
|
sequence load elapsed time |
0.11 |
0.00 |
|
DB time |
14,362.96 |
|
|
background elapsed time |
731.00 |
|
|
background cpu time |
72.00 |
|
Then, it’s a good idea to check if most of the statements are
identified in the SQL sections:
SQL ordered by Elapsed Time
DB/Inst: ORCL/orcl Snaps: 330-336
...
-> Captured SQL account for 94.6% of Total DB
Time (s):
4,589
-> Captured PL/SQL account for 94.5% of Total DB
Time
(s):
4,589
If only a low percentage has been capture, that usually means that
the report cover a period where the database had an heterogeneous
activity, either the duration is too long or there is
too many unshared SQL (not using bind variables). Here I know I’ll
have detail about 94% of the SQL activity, which is good.
| Statistic | Value | End Value |
|---|---|---|
| BUSY_TIME | 1,831,850 | |
| IDLE_TIME | 26,901,106 | |
| IOWAIT_TIME | 226,948 | |
| NICE_TIME | 8 | |
| SYS_TIME | 212,021 | |
| USER_TIME | 1,596,003 | |
| LOAD | 1 | 1 |
| RSRC_MGR_CPU_WAIT_TIME | 0 | |
| VM_IN_BYTES | 1,560,961,024 | |
| VM_OUT_BYTES | 475,336,945,664 | |
| PHYSICAL_MEMORY_BYTES | 12,582,432,768 | |
| NUM_CPUS | 16 | |
| NUM_CPU_CORES | 8 | |
| NUM_CPU_SOCKETS | 2 | |
| GLOBAL_RECEIVE_SIZE_MAX | 4,194,304 | |
| GLOBAL_SEND_SIZE_MAX | 1,048,576 | |
| TCP_RECEIVE_SIZE_DEFAULT | 87,380 | |
| TCP_RECEIVE_SIZE_MAX | 174,760 | |
| TCP_RECEIVE_SIZE_MIN | 4,096 | |
| TCP_SEND_SIZE_DEFAULT | 16,384 | |
| TCP_SEND_SIZE_MAX | 131,072 | |
| TCP_SEND_SIZE_MIN | 4,096 |
| Snap Time | Load | %busy | %user | %sys | %idle | %iowait |
|---|---|---|---|---|---|---|
| 12-Jul 13:00:59 | 0.99 | |||||
| 12-Jul 14:00:03 | 2.67 | 6.47 | 5.63 | 0.77 | 93.53 | 0.56 |
| 12-Jul 15:00:08 | 2.45 | 11.67 | 10.22 | 1.30 | 88.33 | 1.47 |
| 12-Jul 16:00:12 | 2.88 | 11.93 | 10.43 | 1.35 | 88.07 | 1.45 |
| 12-Jul 17:00:16 | 0.74 | 1.61 | 1.37 | 0.21 | 98.39 | 0.46 |
| 12-Jul 18:00:21 | 0.80 | 0.19 | 0.13 | 0.06 | 99.81 | 0.01 |
This report shows,
system is 97 to 98% idle at time of report taken.
If you found very high %busy, %user or sys % and indeed this
will led to low idle %. Investigate what is causing this. OS
Watcher is the tool
which can help in this direction.
| Wait Class | Waits | %Time -outs | Total Wait Time (s) | Avg wait (ms) | %DB time |
|---|---|---|---|---|---|
| DB CPU | 17,767 | 86.31 | |||
| User I/O | 6,536,576 | 0 | 3,500 | 1 | 17.00 |
| Commit | 169,635 | 0 | 666 | 4 | 3.24 |
| Other | 350,080 | 21 | 140 | 0 | 0.68 |
| Concurrency | 78,002 | 0 | 58 | 1 | 0.28 |
| Network | 1,755,547 | 0 | 2 | 0 | 0.01 |
| Application | 579 | 0 | 1 | 2 | 0.00 |
| System I/O | 584 | 0 | 0 | 0 | 0.00 |
| Configuration | 1 | 0 | 0 | 0 | 0.00 |
| Event | Waits | %Time -outs | Total Wait Time (s) | Avg wait (ms) | Waits /txn | % DB time |
|---|---|---|---|---|---|---|
| direct path write temp | 1,837,854 | 0 | 2,267 | 1 | 10.53 | 11.01 |
| direct path read | 2,838,190 | 0 | 930 | 0 | 16.26 | 4.52 |
| log file sync | 169,635 | 0 | 666 | 4 | 0.97 | 3.24 |
| db file sequential read | 13,222 | 0 | 143 | 11 | 0.08 | 0.69 |
| direct path read temp | 1,837,007 | 0 | 131 | 0 | 10.53 | 0.64 |
| PX Deq: Slave Session Stats | 131,555 | 0 | 107 | 1 | 0.75 | 0.52 |
| db file scattered read | 8,448 | 0 | 26 | 3 | 0.05 | 0.13 |
| kksfbc child completion | 441 | 100 | 22 | 51 | 0.00 | 0.11 |
| latch: shared pool | 4,849 | 0 | 16 | 3 | 0.03 | 0.08 |
| library cache: mutex X | 67,703 | 0 | 14 | 0 | 0.39 | 0.07 |
| library cache lock | 346 | 0 | 12 | 35 | 0.00 | 0.06 |
| cursor: pin S wait on X | 582 | 0 | 9 | 16 | 0.00 | 0.05 |
| latch free | 9,647 | 0 | 7 | 1 | 0.06 | 0.03 |
| os thread startup | 116 | 0 | 4 | 32 | 0.00 | 0.02 |
| SQL*Net message to client | 1,739,132 | 0 | 2 | 0 | 9.97 | 0.01 |
| cursor: mutex S | 1,666 | 0 | 2 | 1 | 0.01 | 0.01 |
| latch: row cache objects | 1,658 | 0 | 1 | 1 | 0.01 | 0.01 |
| read by other session | 92 | 0 | 1 | 12 | 0.00 | 0.01 |
| db file parallel read | 344 | 0 | 1 | 3 | 0.00 | 0.00 |
| PX Deq: Signal ACK EXT | 65,787 | 0 | 1 | 0 | 0.38 | 0.00 |
| PX Deq: Signal ACK RSG | 65,787 | 0 | 1 | 0 | 0.38 | 0.00 |
| enq: PS - contention | 758 | 0 | 1 | 1 | 0.00 | 0.00 |
| enq: RO - fast object reuse | 40 | 0 | 1 | 13 | 0.00 | 0.00 |
| Disk file operations I/O | 1,386 | 0 | 0 | 0 | 0.01 | 0.00 |
| enq: KO - fast object checkpoint | 539 | 0 | 0 | 1 | 0.00 | 0.00 |
| PX qref latch | 964 | 100 | 0 | 0 | 0.01 | 0.00 |
| latch: parallel query alloc buffer | 836 | 0 | 0 | 0 | 0.00 | 0.00 |
| latch: cache buffers chains | 174 | 0 | 0 | 1 | 0.00 | 0.00 |
| SQL*Net more data to client | 16,415 | 0 | 0 | 0 | 0.09 | 0.00 |
| enq: TX - index contention | 5 | 0 | 0 | 37 | 0.00 | 0.00 |
| library cache load lock | 1 | 0 | 0 | 139 | 0.00 | 0.00 |
| asynch descriptor resize | 71,974 | 100 | 0 | 0 | 0.41 | 0.00 |
| PX Deq: Table Q Get Keys | 486 | 0 | 0 | 0 | 0.00 | 0.00 |
| reliable message | 577 | 0 | 0 | 0 | 0.00 | 0.00 |
| buffer busy waits | 676 | 0 | 0 | 0 | 0.00 | 0.00 |
| cursor: pin S | 189 | 0 | 0 | 0 | 0.00 | 0.00 |
| row cache lock | 17 | 0 | 0 | 2 | 0.00 | 0.00 |
| direct path sync | 15 | 0 | 0 | 2 | 0.00 | 0.00 |
| latch: cache buffer handles | 1 | 0 | 0 | 29 | 0.00 | 0.00 |
| utl_file I/O | 18 | 0 | 0 | 1 | 0.00 | 0.00 |
| PX Deq: Table Q qref | 1,160 | 0 | 0 | 0 | 0.01 | 0.00 |
| wait list latch free | 13 | 0 | 0 | 1 | 0.00 | 0.00 |
| latch: object queue header operation | 32 | 0 | 0 | 0 | 0.00 | 0.00 |
| control file sequential read | 584 | 0 | 0 | 0 | 0.00 | 0.00 |
| SQL*Net message from client | 1,739,106 | 0 | 260,904 | 150 | 9.97 | |
| jobq slave wait | 41,892 | 100 | 20,964 | 500 | 0.24 | |
| PX Deq: Execution Msg | 746,687 | 0 | 1,612 | 2 | 4.28 | |
| PX Deq: Table Q Normal | 1,057,627 | 0 | 387 | 0 | 6.06 | |
| PX Deq Credit: send blkd | 128,373 | 0 | 266 | 2 | 0.74 | |
| PX Deq: Execute Reply | 710,735 | 0 | 51 | 0 | 4.07 | |
| PX Deq: Parse Reply | 65,790 | 0 | 13 | 0 | 0.38 | |
| PX Deq: Join ACK | 65,790 | 0 | 4 | 0 | 0.38 | |
| PX Deq Credit: need buffer | 1,783 | 0 | 3 | 1 | 0.01 | |
| PX Deq: Table Q Sample | 1,275 | 0 | 1 | 0 | 0.01 |
Foreground Wait Events
Avg %Time Total Wait wait WaitsEvent Waits -outs Time (s) (ms) /txn ---------------------------- -------------- ------ ----------- ------- --------- control file parallel write 1,220 .0 18 15 1.6 control file sequential read 6,508 .0 6 1 8.7 CGS wait for IPC msg 422,253 100.0 1 0 566.0 change tracking file synchro 60 .0 1 13 0.1 db file parallel write 291 .0 0 1 0.4 db file sequential read 90 .0 0 4 0.1 reliable message 136 .0 0 1 0.2 log file parallel write 106 .0 0 2 0.1 lms flush message acks 1 .0 0 60 0.0 gc current block 2-way 200 .0 0 0 0.3 change tracking file synchro 59 .0 0 1 0.1
In this
example our control file parallel write waits (which occurs during
writes to the control file) are taking up 18 seconds total, with
an average wait of 15 milliseconds per wait.
Additionally we can see that we have 1.6 waits per transaction (or
15ms * 1.6 per transaction = 24ms).
| Event | Waits | %Time -outs | Total Wait Time (s) | Avg wait (ms) | Waits /txn | % bg time |
|---|---|---|---|---|---|---|
| log file parallel write | 189,549 | 0 | 615 | 3 | 1.09 | 71.53 |
| db file async I/O submit | 28,334 | 0 | 37 | 1 | 0.16 | 4.27 |
| os thread startup | 711 | 0 | 25 | 35 | 0.00 | 2.88 |
| control file parallel write | 32,030 | 0 | 16 | 1 | 0.18 | 1.88 |
| db file sequential read | 899 | 0 | 14 | 15 | 0.01 | 1.57 |
| latch: shared pool | 7,111 | 0 | 9 | 1 | 0.04 | 1.09 |
| latch: call allocation | 15,537 | 0 | 9 | 1 | 0.09 | 1.07 |
| latch free | 8,264 | 0 | 5 | 1 | 0.05 | 0.63 |
| ARCH wait on ATTACH | 259 | 0 | 3 | 11 | 0.00 | 0.34 |
| Log archive I/O | 726 | 0 | 2 | 3 | 0.00 | 0.24 |
| row cache lock | 2 | 0 | 1 | 746 | 0.00 | 0.17 |
| control file sequential read | 83,303 | 0 | 1 | 0 | 0.48 | 0.12 |
| db file parallel read | 30 | 0 | 1 | 17 | 0.00 | 0.06 |
| Disk file operations I/O | 1,214 | 0 | 0 | 0 | 0.01 | 0.05 |
| log file sequential read | 838 | 0 | 0 | 0 | 0.00 | 0.05 |
| direct path sync | 5 | 0 | 0 | 31 | 0.00 | 0.02 |
| ADR block file read | 80 | 0 | 0 | 2 | 0.00 | 0.02 |
| log file sync | 11 | 0 | 0 | 11 | 0.00 | 0.01 |
| enq: PR - contention | 3 | 0 | 0 | 23 | 0.00 | 0.01 |
| latch: cache buffers chains | 1 | 0 | 0 | 46 | 0.00 | 0.01 |
| db file single write | 264 | 0 | 0 | 0 | 0.00 | 0.00 |
| latch: parallel query alloc buffer | 63 | 0 | 0 | 1 | 0.00 | 0.00 |
| LGWR wait for redo copy | 521 | 0 | 0 | 0 | 0.00 | 0.00 |
| Data file init write | 20 | 0 | 0 | 1 | 0.00 | 0.00 |
| latch: row cache objects | 1 | 0 | 0 | 15 | 0.00 | 0.00 |
| latch: session allocation | 27 | 0 | 0 | 1 | 0.00 | 0.00 |
| db file scattered read | 3 | 0 | 0 | 4 | 0.00 | 0.00 |
| reliable message | 50 | 0 | 0 | 0 | 0.00 | 0.00 |
| direct path write | 14 | 0 | 0 | 1 | 0.00 | 0.00 |
| asynch descriptor resize | 1,442 | 100 | 0 | 0 | 0.01 | 0.00 |
| wait list latch free | 10 | 0 | 0 | 1 | 0.00 | 0.00 |
| rdbms ipc reply | 57 | 0 | 0 | 0 | 0.00 | 0.00 |
| log file single write | 40 | 0 | 0 | 0 | 0.00 | 0.00 |
| ADR block file write | 25 | 0 | 0 | 0 | 0.00 | 0.00 |
| ADR file lock | 30 | 0 | 0 | 0 | 0.00 | 0.00 |
| library cache: mutex X | 2 | 0 | 0 | 1 | 0.00 | 0.00 |
| SQL*Net message to client | 587 | 0 | 0 | 0 | 0.00 | 0.00 |
| rdbms ipc message | 323,540 | 38 | 356,760 | 1103 | 1.85 | |
| PX Idle Wait | 65,885 | 0 | 115,165 | 1748 | 0.38 | |
| DIAG idle wait | 35,863 | 100 | 35,900 | 1001 | 0.21 | |
| Space Manager: slave idle wait | 5,626 | 97 | 27,710 | 4925 | 0.03 | |
| pmon timer | 5,984 | 100 | 17,959 | 3001 | 0.03 | |
| Streams AQ: qmn slave idle wait | 642 | 0 | 17,953 | 27964 | 0.00 | |
| Streams AQ: qmn coordinator idle wait | 1,282 | 50 | 17,953 | 14004 | 0.01 | |
| shared server idle wait | 598 | 100 | 17,946 | 30010 | 0.00 | |
| dispatcher timer | 299 | 100 | 17,942 | 60007 | 0.00 | |
| smon timer | 113 | 33 | 17,719 | 156808 | 0.00 | |
| SQL*Net message from client | 795 | 0 | 1 | 1 | 0.00 | |
| class slave wait | 83 | 0 | 0 | 0 | 0.00 |
| Service Name | DB Time (s) | DB CPU (s) | Physical Reads (K) | Logical Reads (K) |
|---|---|---|---|---|
| FGUARD.fiservipo.com | 19,903 | 17,555 | 413,742 | 386,056 |
| SYS$USERS | 683 | 212 | 1,733 | 6,954 |
| FGUARDXDB | 0 | 0 | 0 | 0 |
| SYS$BACKGROUND | 0 | 0 | 3 | 134 |
Next in the report we find several different reports that
present SQL statements that might be improved by tuning. Any SQL
statement appears in the top 5 statements in two or more areas
below, then it is a prime candidate for tuning. The sections are:
It's interesting to mention that the SUM of columns %CPU + %IO
should be close to 100. If this is far from 100, this can indicate
a problem
SQL Ordered by Elapsed Time
Total Elapsed Time = CPU Time + Wait Time.
Shows which SQL statement runs for a longer time. If a SQL
statement appears in the total elapsed time area of the report
this means its CPU time plus any other wait times made it pop to
the top of the pile. Excessive Elapsed Time could be due to
excessive CPU usage or excessive wait times.
This is the area that you need to examine and probably the one
that will be reported by the users or application support. From a
consumer perspective, the finer details don’t matter. The
application is slow. Full stop.
In conjunction with excessive Elapsed time check to see if this
piece of SQL is also a high consumer under Total CPU Time. It is
normally the case. Otherwise check the wait times and Total Disk
Reads. They can either indicate issues with wait times (slow
disks, latch gets etc) or too much Physical IO associated with
tables scans or sub-optimal indexes. This section is a gate
opener and often you will need to examine other sections.
SQL Ordered by CPU Time
When a statement appears in the Total CPU Time area this indicates
it used excessive CPU cycles during its processing. Excessive CPU
processing time can be caused by sorting, excessive function usage
or long parse times. Indicators that you should be looking at this
section for SQL tuning candidates include high CPU percentages in
the service section for the service associated with this SQL (a
hint, if the SQL is uppercase it probably comes from a user or
application; if it is lowercase it usually comes from the internal
or background processes). To reduce total CPU time, reduce sorting
by using composite indexes that can cover sorting and use bind
variables to reduce parse times.
SQL Ordered by Buffer Gets
Total buffer gets mean a SQL statement is reading a lot of data
from the db block buffers. Generally speaking buffer gets (AKA
logical IO or LIO) are OK, except when they become excessive. The
old saying that you reduce the logical IO, because then the
physical IO (disk read) will take care of itself holds true. LIO
may have incurred a PIO in order to get the block into the
buffer in the first place. Reducing buffer gets is very important
and should not be underestimated. To get a block from db block
buffers, we have to latch it (i.e. in order to prevent someone
from modifying the data structures we are currently reading from
the buffer). Although latches are less persistent than locks, a
latch is still a serialization device. Serialization devices
inhibit scalability, the more you use them, the less concurrency
you get. Therefore in most cases optimal buffer gets can result in
improved performance. Also note that by lowering buffer gets you
will require less CPU usage and less latching. |Thus to reduce
excessive buffer gets, optimize SQL to use appropriate indexes and
reduce full table scans. You can also look at improving the
indexing strategy and consider deploying partitioning (licensed).
SQL Ordered by Disk Reads
High total disk reads mean a SQL statement is reading a lot of
data from disks rather than being able to access that data from
the db block buffers. High physical reads after a server reboot
are expected as the cache is cold and data is fetched from the
disk. However, disk reads (or physical reads) are undesirable in
an OLTP system, especially when they become excessive. Excessive
disk reads do cause performance issues. The usual norm is to
increase the db buffer cache to allow more buffers and reduce
ageing . Total disk reads are typified by high physical reads, a
low buffer cache hit ratio, with high IO wait times. Higher wait
times for Disk IO can be associated with a variety of reasons
(busy or over saturated SAN, slower underlying storage, low
capacity in HBC and other hardware causes). Statistics on IO
section in AWR, plus the Operating System diagnostic tools as
simple as iostatcan help in identifying these issues. To reduce
excessive disk reads, consider partitioning, use indexes and look
at optimizing SQL to avoid excessive full table scans.
SQL Ordered by Executions
High total executions need to be reviewed to see if they are
genuine executions or loops in SQL code. I have also seen
situations where autosys jobs fire duplicate codes erroneously. In
general statements with high numbers of executions usually are
being properly reused. However, there is always a chance of
unnecessary loop in PL/SQL, Java or C#. Statements with high
number of executions, high number of logical and or physical reads
are candidates for review to be sure they are not being executed
multiple times when a single execution would serve. If the
database has excessive physical and logical reads or excessive IO
wait times, then look at the SQL statements that show excessive
executions and show high physical and logical reads.
Parse Calls
Whenever a statement is issued by a user or process, regardless of
whether it is in the SQL pool it undergoes a parse. As
explained under Parsing, the parse can be a hard parse or a soft
parse. Excessive parse calls usually go with excessive executions.
If the statement is using what are known as unsafe bind variables
then the statement will be reparsed each time. If the header parse
ratios are low look here and in the version count areas.
SQL Ordered by Memory
Sharable Memory refers to Shared Pool memory area in SGA , hence
this particular section in AWR Report states about the SQL
STATEMENT CURSORS which consumed the maximum amount of the Shared
Pool for their execution.
In general high values for Sharable Memory doesn’t necessary imply
there is an issue It simply means that:
- These SQL statements are big or complex and
Oracle has to keep lots of information about these statements OR
- big number of child cursors exist for those
parent cursors
- combination of 1 & 2
In case of point 2, it may be due to poor coding such as bind
variables mismatch, security mismatch or overly large SQL
statements that join many tables. In a DSS or DW environment
large complex statements are normal. In an OLTP database large or
complex statements are usually the result of over-normalization of
the database design, attempts to use an OLTP system as a DW or
simply poor coding techniques. Usually large statements will
result in excessive parsing, recursion, and large CPU usage.
SQL Ordered by Version Count
High version counts are usually due to multiple identical-schema
databases, unsafe bind variables, or Oracle bugs.
The SQL that is stored in the shared pool SQL area (Library cache)
is reported in this section in different ways:
. SQL ordered by Buffer Gets
. SQL ordered by Physical Reads
. SQL ordered by Executions
. SQL ordered by Parse Calls
- SQL ordered by Gets:
This section reports the contents of the SQL area ordered by the
number of buffer gets and can be used to identify the most CPU Heavy SQL.
- Many DBAs feel that if the data is already contained within the
buffer cache the query should be efficient. This could not
be further from the truth. Retrieving more data than needed,
even from the buffer cache, requires CPU cycles and interprocess
IO. Generally speaking, the cost of physical I/O is not 10,000
times more expensive. It actually is in the neighborhood of
67 times and actually almost zero if the data is stored in the
UNIX buffer cache.
- The statements of interest are those with a large number of gets
per execution especially if the number of executions is high.
- High buffer gets generally correlates with heavy CPU usage
- SQL ordered by Reads:
This section reports the contents of the SQL area ordered by the
number of reads from the data files and can be used to identify
SQL causing IO bottlenecks which consume the following resources.
- CPU time needed to fetch unnecessary data.
- File IO resources to fetch unnecessary data.
- Buffer resources to hold unnecessary data.
- Additional CPU time to process the query once the data is
retrieved into the buffer.
- SQL ordered by Executions:
This section reports the contents of the SQL area ordered by the
number of query executions. It is primarily useful in identifying
the most frequently used SQL within the database so that they can
be monitored for efficiency. Generally speaking, a small
performance increase on a frequently used query provides greater
gains than a moderate performance increase on an infrequently used
query. Possible reasons for high Reads per Exec are use of
unselective indexes require large numbers of blocks to be fetched
where such blocks are not cached well in the buffer cache, index
fragmentation, large Clustering Factor in index etc.
- SQL ordered by Parse Calls:
This section shows the number of times a statement was parsed as
compared to the number of times it was executed. One to one
parse/executions may indicate that:
- Bind variables are not being used.
The shared pool may be too small and the parse is not being
retained long enough for multiple executions.
- cursor_sharing is set to exact (this should NOT be changed
without considerable testing on the part of the client).
If you have identified one or more problematic SQL statement, you may want to check the execution plan. Remember the "Old Hash Value" from the report above (1279400914), then execute the scrip to generate the execution plan.
sqlplus perfstat/perfstat
SQL> @?/rdbms/admin/sprepsql.sql
Enter the Hash Value, in this example: 1279400914SQL Text
~~~~~~~~
create table test as select * from all_objects
Known Optimizer Plan(s) for this Old Hash Value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Shows all known Optimizer Plans for this database instance, and the Snap Id's
they were first found in the shared pool. A Plan Hash Value will appear
multiple times if the cost has changed
-> ordered by Snap Id
First First Plan
Snap Id Snap Time Hash Value Cost
--------- --------------- ------------ ----------
6 14 Nov 04 11:26 1386862634 52
Plans in shared pool between Begin and End Snap Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Shows the Execution Plans found in the shared pool between the begin and end
snapshots specified. The values for Rows, Bytes and Cost shown below are those
which existed at the time the first-ever snapshot captured this plan - these
values often change over time, and so may not be indicative of current values
-> Rows indicates Cardinality, PHV is Plan Hash Value
-> ordered by Plan Hash Value
--------------------------------------------------------------------------------
| Operation | PHV/Object Name | Rows | Bytes| Cost |
--------------------------------------------------------------------------------
|CREATE TABLE STATEMENT |----- 1386862634 ----| | | 52 |
|LOAD AS SELECT | | | | |
| VIEW | | 1K| 216K| 44 |
| FILTER | | | | |
| HASH JOIN | | 1K| 151K| 38 |
| TABLE ACCESS FULL |USER$ | 29 | 464 | 2 |
| TABLE ACCESS FULL |OBJ$ | 3K| 249K| 35 |
| TABLE ACCESS BY INDEX ROWID |IND$ | 1 | 7 | 2 |
| INDEX UNIQUE SCAN |I_IND1 | 1 | | 1 |
| NESTED LOOPS | | 5 | 115 | 16 |
| INDEX RANGE SCAN |I_OBJAUTH1 | 1 | 10 | 2 |
| FIXED TABLE FULL |X$KZSRO | 5 | 65 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| FIXED TABLE FULL |X$KZSPR | 1 | 26 | 14 |
| VIEW | | 1 | 13 | 2 |
| FAST DUAL | | 1 | | 2 |
--------------------------------------------------------------------------------
This section provides us with a number of various statistics
(such as, how many DBWR Checkpoints occurred, or how many
consistent gets occurred during the snapshot). These are the
statistics that the summary information is derived from. A list of
the statistics maintained by the RDBMS kernel can be found in
Appendix C of the Oracle Reference manual for the version being
utilized.
Here is a partial example of the report:
Instance Activity Stats for DB: PHS2 Instance:
phs2 Snaps: 100 -104
Statistic
Total
per
Second
per
Trans
--------------------------------- ----------------
------------ ------------
CPU used by this
session
84,161
23.4 3,825.5
CPU used when call
started
196,346
54.5 8,924.8
CR blocks
created
709
0.2 32.2
DBWR buffers
scanned
0
0.0 0.0
DBWR checkpoint buffers
written
245
0.1 11.1
DBWR
checkpoints
33
0.0 1.5
DBWR cross instance
writes
93
0.0 4.2
DBWR free buffers
found
0
0.0 0.0
....
....
branch node
splits
7,162
0.1 0.0
consistent
gets
12,931,850,777
152,858.8 3,969.5
current blocks converted for
CR
75,709
0.9 0.0
db block
changes
343,632,442
4,061.9 105.5
db block
gets
390,323,754
4,613.8 119.8
hot buffers moved to head of
LRU
197,262,394
2,331.7 60.6
leaf node 90-10
splits
26,429
0.3 0.0
leaf node
splits
840,436
9.9 0.3
logons
cumulative
21,369
0.3 0.0
physical
reads
504,643,275
5,965.1 154.9
physical
writes
49,724,268
587.8 15.3
session logical
reads
13,322,170,917
157,472.5 4,089.4
sorts
(disk)
4,132
0.1 0.0
sorts
(memory)
7,938,085
93.8 2.4
sorts
(rows)
906,207,041
10,711.7 278.2
table fetch continued
row
25,506,365
301.5 7.8
table scans (long
tables)
111
0.0 0.0
table scans (short
tables)
1,543,085
18.2 0.5
Instance Activity Terminology
Session Logical Reads = All reads cached in memory.
Includes both consistent gets and also the db block gets.
Consistent Gets = These are the reads of a block that are
in the cache. They are NOT to be confused with consistent
read (cr) version of a block in the buffer cache (usually the
current version is read).
Db block gets = These are block gotten to be changed.
MUST be the CURRENT block and not a cr block.
Db block changes = These are the db block gets (above) that
were actually changed.
Physical Reads = Blocks not read from the cache.
Either from disk, disk cache or O/S cache; there are also physical
reads direct which bypass cache using Parallel Query (not in hit
ratios).
Of particular interest are the following statistics.
- CPU USED BY THIS SESSION,
PARSE TIME CPU or RECURSIVE CPU USAGE: These
numbers are useful to diagnose CPU saturation on the system
(usually a query tuning issue). The formula to calculate the CPU
usage breakdown is:
Service (CPU) Time = other CPU + parse time CPU
Other CPU = "CPU used by this session" - parse time CPU
Some releases do not correctly store this data and can show huge
numbers.
recursive cpu usage = This component can be high if large amounts of PL/SQL are being processed. It is outside the scope of this document to go into detail with this, but you will need to identify your complete set of PL/SQL, including stored procedures, finding the ones with the highest CPU load and optimize these. If most work done in PL/SQL is procedural processing (rather than executing SQL), a high recursive cpu usage can actually indicate a potential tuning effort.
parse time cpu= Parsing SQL statements is a heavy operation, that should be avoided by reusing SQL statements as much as possible. In precompiler programs, unnecessary parting of implicit SQL statements can be avoided by increasing the cursor cache (MAXOPENCURSORS parameter) and by reusing cursors. In programs using Oracle Call Interface, you need to write the code, so that it re-executes (in stead of reparse) cursors with frequently executed SQL statements. The v$sql view contains PARSE_CALLS and EXECUTIONS columns, that can be used to identify SQL, that is parsed often or is only executed once per parse.
other cpu= The source of other cpu is primarily handling of buffers in the buffer cache. It can generally be assumed, that the CPU time spent by a SQL statement is approximately proportional to the number of buffer gets for that SQL statements, hence, you should identify and sort SQL statements by buffer gets in v$sql. In your report, look at the part ‘SQL ordered by Gets for DB’. Start tuning SQL statements from the top of this list. In Oracle, the v$sql view contain a column, CPU_TIME, which directly shows the cpu time associated with executing the SQL statement.
- DBWR BUFFERS SCANNED:
the
number
of
buffers
looked at when scanning the lru portion of the buffer cache for
dirty buffers to make clean. Divide by "dbwr lru scans" to find
the average number of buffers scanned. This count includes both
dirty and clean buffers. The average buffers scanned may be
different from the average scan depth due to write batches filling
up before a scan is complete. Note that this includes scans for
reasons other than make free buffer requests.
- DBWR CHECKPOINTS: the
number of checkpoints messages that were sent to DBWR and not
necessarily the total number of actual checkpoints that took
place. During a checkpoint there is a slight decrease in
performance since data blocks are being written to disk and that
causes I/O. If the number of checkpoints is reduced, the
performance of normal database operations improve but recovery
after instance failure is slower.
- DBWR TIMEOUTS: the
number of timeouts when DBWR had been idle since the last
timeout. These are the times that DBWR looked for buffers to
idle write.
- DIRTY BUFFERS INSPECTED:
the number of times a foreground encountered a dirty buffer which
had aged out through the lru queue, when foreground is looking for
a buffer to reuse. This should be zero if DBWR is keeping up with
foregrounds.
- FREE BUFFER INSPECTED:
the number of buffers skipped over from the end of the LRU queue
in order to find a free buffer. The difference between this
and "dirty buffers inspected" is the number of buffers that could
not be used because they were busy or needed to be written after
rapid aging out. They may have a user, a waiter, or being
read/written.
- RECURSIVE CALLS:
Recursive calls occur because of cache misses and segment
extension. In general if recursive calls is greater than 30 per
process, the data dictionary cache should be optimized and
segments should be rebuilt with storage clauses that have few
large extents. Segments include tables, indexes, rollback
segment, and temporary segments.
NOTE: PL/SQL can generate extra recursive calls which may be
unavoidable.
- REDO BUFFER ALLOCATION RETRIES:
total number of retries necessary to allocate space in the redo
buffer. Retries are needed because either the redo writer
has gotten behind, or because an event (such as log switch)
is occurring
- REDO LOG SPACE REQUESTS:
indicates
how
many
times
a user process waited for space in the redo log buffer. Try
increasing the init.ora parameter LOG_BUFFER so that zero Redo Log
Space Requests are made.
- REDO WASTAGE: Number of
bytes "wasted" because redo blocks needed to be written before
they are completely full. Early writing may be needed
to commit transactions, to be able to write a database buffer, or
to switch logs
- SUMMED DIRTY QUEUE LENGTH:
the sum of the lruw queue length after every write request
completes. (divide by write requests to get average queue length
after write completion)
- TABLE FETCH BY ROWID:
the number of rows that were accessed by a rowid. This
includes rows that were accessed using an index and rows that were
accessed using the statement where rowid = 'xxxxxxxx.xxxx.xxxx'.
- TABLE FETCH BY CONTINUED ROW:
indicates the number of rows that are chained to another block. In
some cases (i.e. tables with long columns) this is unavoidable,
but the ANALYZE table command should be used to further
investigate the chaining, and where possible, should be eliminated
by rebuilding the table.
- Table Scans (long tables)
is the total number of full table scans performed on tables with
more than 5 database blocks. If the number of full table
scans is high the application should be tuned to effectively use
Oracle indexes. Indexes, if they exist, should be used on long
tables if less than 10-20% (depending on parameter settings and
CPU count) of the rows from the table are returned. If this is not
the case, check the db_file_multiblock_read_count parameter
setting. It may be too high. You may also need to tweak
optimizer_index_caching and optimizer_index_cost_adj.
- Table Scans (short tables)
is the number of full table scans performed on tables with less
than 5 database blocks. It is optimal to perform full table
scans on short tables rather than using indexes.
- Tablespace I/O Stats for DB: Ordered by total IO per
tablespace.
- File I/O Stats for DB: Ordered alphabetically by tablespace,
filename.
If the statistic "Buffer Waits" for a tablespace is greater than
1000, you may want to consider tablespace reorganization in order
to spread tables within it across another tablespaces.
Note that Oracle considers average read times of greater than 20
ms unacceptable. If a datafile consistently has average read
times of 20 ms or greater then:
- The queries against the contents of the owning tablespace should
be examined and tuned so that less data is retrieved.
- If the tablespace contains indexes, another option is to
compress the indexes so that they require less space and hence,
less IO.
- The contents of that datafile should be redistributed across
several disks/logical volumes to more easily accommodate the load.
- If the disk layout seems optimal, check the disk controller
layout. It may be that the datafiles need to be distributed
across more disk sets.
| Tablespace | Reads | Av Reads/s | Av Rd(ms) | Av Blks/Rd | Writes | Av Writes/s | Buffer Waits | Av Buf Wt(ms) |
|---|---|---|---|---|---|---|---|---|
| TEMPFG | 1,839,383 | 102 | 0.00 | 31.00 | 1,837,948 | 102 | 74 | 1.62 |
| FG_DATA | 2,791,647 | 155 | 0.01 | 125.85 | 9,618 | 1 | 12 | 0.00 |
| FG_DATA_ARCH | 48,174 | 3 | 0.14 | 127.34 | 1 | 0 | 0 | 0.00 |
| FG_INDX | 16,194 | 1 | 3.51 | 60.39 | 4,647 | 0 | 23 | 0.00 |
| SYSAUX | 1,331 | 0 | 29.00 | 1.02 | 7,867 | 0 | 18 | 43.33 |
| SYSTEM | 4,491 | 0 | 8.38 | 1.30 | 2,154 | 0 | 278 | 0.97 |
| UNDOTBS1 | 0 | 0 | 0.00 | 0.00 | 4,450 | 0 | 381 | 0.03 |
| Tablespace | Filename | Reads | Av Reads/s | Av Rd(ms) | Av Blks/Rd | Writes | Av Writes/s | Buffer Waits | Av Buf Wt(ms) |
|---|---|---|---|---|---|---|---|---|---|
| FG_DATA | /oradata/FGUARD/fg_data01.dbf | 332,276 | 18 | 0.02 | 125.95 | 1,537 | 0 | 5 | 0.00 |
| FG_DATA | /oradata/FGUARD/fg_data02.dbf | 332,928 | 19 | 0.02 | 125.87 | 575 | 0 | 0 | 0.00 |
| FG_DATA | /oradata/FGUARD/fg_data03.dbf | 524,409 | 29 | 0.01 | 126.72 | 2,145 | 0 | 0 | 0.00 |
| FG_DATA | /oradata/FGUARD/fg_data04.dbf | 421,718 | 23 | 0.02 | 124.68 | 995 | 0 | 1 | 0.00 |
| FG_DATA | /oradata/FGUARD/fg_data05.dbf | 323,349 | 18 | 0.02 | 124.58 | 709 | 0 | 0 | 0.00 |
| FG_DATA | /oradata/FGUARD/fg_data06.dbf | 332,548 | 19 | 0.02 | 125.68 | 1,338 | 0 | 0 | 0.00 |
| FG_DATA | /oradata/FGUARD/fg_data07.dbf | 331,332 | 18 | 0.01 | 126.07 | 1,027 | 0 | 3 | 0.00 |
| FG_DATA | /oradata/FGUARD/fg_data08.dbf | 193,087 | 11 | 0.00 | 127.85 | 1,292 | 0 | 3 | 0.00 |
| FG_DATA_ARCH | /oradata/FGUARD/fg_data_arch01.dbf | 1,993 | 0 | 0.55 | 126.71 | 0 | 0 | 0 | 0.00 |
| FG_DATA_ARCH | /oradata/FGUARD/fg_data_arch02.dbf | 15,772 | 1 | 0.19 | 127.35 | 1 | 0 | 0 | 0.00 |
| FG_DATA_ARCH | /oradata/FGUARD/fg_data_arch03.dbf | 16,163 | 1 | 0.09 | 127.37 | 0 | 0 | 0 | 0.00 |
| FG_DATA_ARCH | /oradata/FGUARD/fg_data_arch04.dbf | 14,246 | 1 | 0.10 | 127.37 | 0 | 0 | 0 | 0.00 |
| FG_INDX | /oradata/FGUARD/fg_indx01.dbf | 2,908 | 0 | 3.84 | 39.20 | 358 | 0 | 1 | 0.00 |
| FG_INDX | /oradata/FGUARD/fg_indx02.dbf | 1,204 | 0 | 10.97 | 71.13 | 1,130 | 0 | 5 | 0.00 |
| FG_INDX | /oradata/FGUARD/fg_indx03.dbf | 7,588 | 0 | 0.93 | 62.00 | 1,132 | 0 | 6 | 0.00 |
| FG_INDX | /oradata/FGUARD/fg_indx04.dbf | 1,733 | 0 | 5.79 | 64.18 | 829 | 0 | 2 | 0.00 |
| FG_INDX | /oradata/FGUARD/fg_indx05.dbf | 1,714 | 0 | 7.06 | 65.41 | 927 | 0 | 3 | 0.00 |
| FG_INDX | /oradata/FGUARD/fg_indx06.dbf | 1,047 | 0 | 3.07 | 80.76 | 271 | 0 | 6 | 0.00 |
| SYSAUX | /oradata/FGUARD/sysaux01.dbf | 382 | 0 | 30.63 | 1.05 | 5,087 | 0 | 8 | 0.00 |
| SYSAUX | /oradata/FGUARD/sysaux02.dbf | 949 | 0 | 28.35 | 1.00 | 2,780 | 0 | 10 | 78.00 |
| SYSTEM | /oradata/FGUARD/system01.dbf | 4,465 | 0 | 8.32 | 1.30 | 2,001 | 0 | 269 | 0.93 |
| SYSTEM | /oradata/FGUARD/system02.dbf | 26 | 0 | 19.23 | 1.00 | 153 | 0 | 9 | 2.22 |
| TEMPFG | /oradata/FGUARD/TEMPFG01.dbf | 1,839,383 | 102 | 0.00 | 31.00 | 1,837,948 | 102 | 74 | 1.62 |
| UNDOTBS1 | /oradata/FGUARD/undotbs01.dbf | 0 | 0 | 4,450 | 0 | 381 | 0.03 |
Buffer Pool
Statistics Section
The buffer pool statistics report follows. It provides a summary
of the buffer pool configuration and usage statistics.
The buffer statistics are comprised of two sections:
- Buffer Pool Statistics: This section can have
multiple entries if multiple buffer pools are allocated. A
baseline of the database's buffer pool statistics should be
available to compare with the current report buffer pool
statistics. A change in that pattern unaccounted for by a
change in workload should be a cause for concern. Also check the Buffer Pool Advisory to
identify if increasing that parameter (db_cache_size) would help
to reduce Physical Reads.
| P | Number of Buffers | Pool Hit% | Buffer Gets | Physical Reads | Physical Writes | Free Buff Wait | Writ Comp Wait | Buffer Busy Waits |
|---|---|---|---|---|---|---|---|---|
| D | 183,303 | 99 | 34,022,316 | 230,167 | 85,445 | 0 | 0 | 786 |
- Checkpoint Activity:
In this section, we receive several recommendations on changes
that we can perform and how that will affect the overall
performance of the DB.
The instance recovery stats report provides information related
to instance recovery. By analyzing this report, you can determine
roughly how long your database would have required to perform
crash recovery during the reporting period. Here is an example of
this report:
| Targt MTTR (s) | Estd MTTR (s) | Recovery Estd IOs | Actual RedoBlks | Target RedoBlks | Log Sz RedoBlks | Log Ckpt Timeout RedoBlks | Log Ckpt Interval RedoBlks | Opt Log Sz(M) | Estd RAC Avail Time | |
|---|---|---|---|---|---|---|---|---|---|---|
| B | 0 | 17 | 3186 | 40426 | 88123 | 995328 | 88123 | |||
| E | 0 | 16 | 3068 | 34271 | 35669 | 995328 | 35669 |
The buffer pool advisory report answers the question, how big should you make your database buffer cache.
| P | Size for Est (M) | Size Factor | Buffers (thousands) | Est Phys Read Factor | Estimated Phys Reads (thousands) | Est Phys Read Time | Est %DBtime for Rds |
|---|---|---|---|---|---|---|---|
| D | 144 | 0.10 | 18 | 1.15 | 4,378 | 1 | 1922.00 |
| D | 288 | 0.19 | 35 | 1.10 | 4,180 | 1 | 1388.00 |
| D | 432 | 0.29 | 53 | 1.04 | 3,976 | 1 | 835.00 |
| D | 576 | 0.39 | 71 | 1.03 | 3,917 | 1 | 676.00 |
| D | 720 | 0.48 | 89 | 1.02 | 3,886 | 1 | 593.00 |
| D | 864 | 0.58 | 106 | 1.01 | 3,864 | 1 | 534.00 |
| D | 1,008 | 0.68 | 124 | 1.01 | 3,850 | 1 | 495.00 |
| D | 1,152 | 0.77 | 142 | 1.01 | 3,841 | 1 | 470.00 |
| D | 1,296 | 0.87 | 160 | 1.00 | 3,829 | 1 | 439.00 |
| D | 1,440 | 0.97 | 177 | 1.00 | 3,818 | 1 | 409.00 |
| D | 1,488 | 1.00 | 183 | 1.00 | 3,815 | 1 | 401.00 |
| D | 1,584 | 1.06 | 195 | 1.00 | 3,813 | 1 | 395.00 |
| D | 1,728 | 1.16 | 213 | 1.00 | 3,812 | 1 | 393.00 |
| D | 1,872 | 1.26 | 231 | 1.00 | 3,811 | 1 | 390.00 |
| D | 2,016 | 1.35 | 248 | 1.00 | 3,810 | 1 | 387.00 |
| D | 2,160 | 1.45 | 266 | 1.00 | 3,808 | 1 | 383.00 |
| D | 2,304 | 1.55 | 284 | 1.00 | 3,808 | 1 | 382.00 |
| D | 2,448 | 1.65 | 302 | 1.00 | 3,808 | 1 | 382.00 |
| D | 2,592 | 1.74 | 319 | 1.00 | 3,808 | 1 | 382.00 |
| D | 2,736 | 1.84 | 337 | 1.00 | 3,808 | 1 | 382.00 |
| D | 2,880 | 1.94 | 355 | 0.93 | 3,536 | 1 | 121.00 |
In this example we currently have 1.488 GB allocated to the SGA
(represented by the size factor column with a value of 1.0.
It appears that if we were to reduce the memory allocated to the
SGA to half of the size of the current SGA (freeing the memory to
the OS for other processes) we would incur an increase of just a
few more physical Reads in the process.
PGA
Reports
The PGA reports provide some insight into the health of the PGA.
- The PGA Aggr Target Stats report provides information on the
configuration of the PGA Aggregate Target parameter during the
reporting period.
- The PGA Aggregate Target Histogram report provides information
on the size of various operations (e.g. sorts). It will indicate
if PGA sort operations occurred completely in memory, or if some
of those operations were written out to disk.
- The PGA Memory Advisor, much like the buffer pool advisory
report, provides some insight into how to properly size your PGA
via the PGA_AGGREGATE_TARGET database parameter.
Here we show these reports:
| PGA Aggr Target(M) | Auto PGA Target(M) | PGA Mem Alloc(M) | W/A PGA Used(M) | %PGA W/A Mem | %Auto W/A Mem | %Man W/A Mem | Global Mem Bound(K) | |
|---|---|---|---|---|---|---|---|---|
| B | 1,024 | 1,226 | 480.56 | 0.00 | 0.00 | 0.00 | 0.00 | 163,840 |
| E | 1,024 | 1,199 | 422.10 | 0.62 | 0.15 | 100.00 | 0.00 | 163,840 |
| Low Optimal | High Optimal | Total Execs | Optimal Execs | 1-Pass Execs | M-Pass Execs |
|---|---|---|---|---|---|
| 2K | 4K | 132,478 | 132,478 | 0 | 0 |
| 64K | 128K | 690 | 690 | 0 | 0 |
| 128K | 256K | 422 | 422 | 0 | 0 |
| 256K | 512K | 713 | 713 | 0 | 0 |
| 512K | 1024K | 4,128 | 4,128 | 0 | 0 |
| 1M | 2M | 796 | 796 | 0 | 0 |
| 2M | 4M | 172 | 172 | 0 | 0 |
| 4M | 8M | 98 | 98 | 0 | 0 |
| 8M | 16M | 56 | 56 | 0 | 0 |
| 64M | 128M | 1,507 | 0 | 1,507 | 0 |
| PGA Target Est (MB) | Size Factr | W/A MB Processed | Estd Extra W/A MB Read/ Written to Disk | Estd PGA Cache Hit % | Estd PGA Overalloc Count | Estd Time |
|---|---|---|---|---|---|---|
| 200 | 0.13 | 201,044.50 | 717,452.25 | 22.00 | 1,912 | 57,991,729 |
| 400 | 0.25 | 201,044.50 | 208,684.37 | 49.00 | 0 | 25,869,319 |
| 800 | 0.50 | 201,044.50 | 181,379.82 | 53.00 | 0 | 24,145,374 |
| 1,200 | 0.75 | 201,044.50 | 181,379.82 | 53.00 | 0 | 24,145,374 |
| 1,600 | 1.00 | 201,044.50 | 181,379.82 | 53.00 | 0 | 24,145,374 |
| 1,920 | 1.20 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 2,240 | 1.40 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 2,560 | 1.60 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 2,880 | 1.80 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 3,200 | 2.00 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 4,800 | 3.00 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 6,400 | 4.00 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 9,600 | 6.00 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
| 12,800 | 8.00 | 201,044.50 | 0.00 | 100.00 | 0 | 12,693,478 |
Buffer Wait
Statistics
The buffer wait statistics report helps you drill down on specific
buffer wait events, and where the waits are occurring. In the
following report we find that the 13 buffer busy waits we saw in
the buffer pool statistics report earlier are attributed to data
block waits. We might then want to pursue tuning remedies to these
waits if the waits are significant enough. Here is an example
of the buffer wait statistics report:
Buffer Wait Statistics
DB/Inst: AULTDB/aultdb1Snaps: 91-92
-> ordered by wait time desc, waits desc
Class
Waits Total Wait Time (s) Avg Time (ms)
------------------ ----------- -------------------
--------------
data
block
13
0
1
undo
header
1
0
10
Enqueue
Statistics
An enqueue is simply a locking mechanism. This section is very
useful and must be used when the wait event "enqueue" is listed in
the "Top 5 timed events".
The Enqueue activity report provides information on enqueues
(higher level Oracle locking) that occur.
As with other reports, if you see high levels of wait times in
these reports, you might dig further into the nature of the
enqueue and determine the cause of the delays.
Here is an example of this report section:
EnqueueActivity
DB/Inst: AULTDB/aultdb1 Snaps:91-92
-> only enqueues with waits are shown
-> Enqueue stats gathered prior to 10g should not be compared
with 10g data
-> ordered by Wait Time desc, Waits desc
Enqueue Type (Request Reason)
------------------------------------------------------------------------------
Requests Succ Gets
Failed Gets Waits Wt
Time (s) Av Wt Time(ms)
------------ ------------ ----------- -----------
------------ --------------
PS-PX Process Reservation
386
358
28
116
0
.43
US-Undo Segment
276
276
0
228
0
.18
TT-Tablespace
90
90
0
42
0
.71
WF-AWR Flush
12
12
0
7
0
1.43
MW-MWIN Schedule
2
2
0
2
0
5.00
TA-Instance Undo
12
12
0
12
0
.00
UL-User-defined
7
7
0
7
0
.00
CF-Controlfile Transaction
5,737
5,737
0
5
0
.00
- TX (Transaction Lock): Generally due to application concurrency
mechanisms, or table setup issues. The TX lock is acquired when a
transaction initiates its first change and is held until the
transaction does a COMMIT or ROLLBACK. It is used mainly as a
queuing mechanism so that other resources can wait for a
transaction to complete.
- TM (DML enqueue): Generally due to application issues,
particularly if foreign key constraints have not been indexed.
This lock/enqueue is acquired when performing an insert, update,
or delete on a parent or child table.
- ST (Space management enqueue): Usually caused by too much space
management occurring. For example: create table as select on large
tables on busy instances, small extent sizes, lots of sorting,
etc. These enqueues are caused if a lot of space management
activity is occurring on the database (such as small extent size,
several sortings occurring on the disk).
V$SESSION_WAIT and V$LOCK give more data about enqueues
- The P1, P2 and P3 values tell what the enqueuemay have been
waiting on
- For BF we get node#, parallelizer#, and bloom#
column parameter1 format
a15
column parameter2 format a15
column parameter3 format a15
column lock format a8
Select substr(name,1,7) as
"lock",parameter1,parameter2,parameter3
from v$event_name
where name like 'enq%';
Undo
Statistics Section
The undo segment summary report provides basic information on the
performance of undo tablespaces.
Undo information is provided in the following sections:
- Undo Segment Summary
- Undo Segment Stats
The examples below show typical performance problem related to Undo (rollback) segments:
- Undo Segment Summary for DB
Undo Segment Summary for DB: S901 Instance: S901 Snaps: 2 -3The description of the view V$UNDOSTAT in the Oracle Database Reference guide provides some insight as to the columns definitions. Should the client encounter SMU problems, monitoring this view every few minutes would provide more useful information.
-> Undo segment block stats:
-> uS - unexpired Stolen, uR - unexpired Released, uU - unexpired reUsed
-> eS - expired Stolen, eR - expired Released, eU - expired reUsed
Undo Undo Num Max Qry Max Tx Snapshot Out of uS/uR/uU/
TS# Blocks Trans Len (s) Concurcy Too Old Space eS/eR/eU
---- -------------- ---------- -------- ---------- -------- ------ -------------
1 20,284 1,964 8 12 0 0 0/0/0/0/0/0
- Undo Segment Stats for DB
Undo Segment Stats for DB: S901 Instance: S901 Snaps: 2 -3This section provides a more detailed look at the statistics in the previous section by listing the information as it appears in each snapshot.
-> ordered by Time desc
Undo Num Max Qry Max Tx Snap Out of uS/uR/uU/
End Time Blocks Trans Len (s) Concy Too Old Space eS/eR/eU
------------ ------------ -------- ------- -------- ------- ------ -------------
12-Mar 16:11 18,723 1,756 8 12 0 0 0/0/0/0/0/0
12-Mar 16:01 1,561 208 3 12 0 0 0/0/0/0/0/0
Use of UNDO_RETENTION can potentially increase the size of the
undo segment for a given period of time, so the retention period
should not be arbitrarily set too high. The UNDO tablespace
still must be sized appropriately. The following calculation can
be used to determine how much space a given undo segment will
consume given a set value of UNDO_RETENTION.
Undo Segment Space Required = (undo_retention_time *
undo_blocks_per_seconds)
As an example, an UNDO_RETENTION of 5 minutes (default) with 50 undo blocks/second (8k blocksize) will generate:
Undo Segment Space Required = (300 seconds * 50 blocks/ seconds * 8K/block) = 120 M
The retention information (transaction commit time) is stored in every transaction table block and each extent map block. When the retention period has expired, SMON will be signaled to perform undo reclaims, done by scanning each transaction table for undo timestamps and deleting the information from the undo segment extent map. Only during extreme space constraint issues will retention period not be obeyed.
Latch Statistics Section
The latch activity report provides information on Oracle's low
level locking mechanism called a latch. From this report you can
determine if Oracle is suffering from latching problems, and if
so, which latches are causing the greatest amount of contention on
the system.
Latch information is provided in the following three sections:
. Latch Activity
. Latch Sleep breakdown
. Latch Miss Sources
This information should be checked whenever the "latch free" wait
event or other latch wait events experience long waits. This
section is particularly useful for determining latch contention on
an instance. Latch contention generally indicates resource
contention and supports indications of it in other sections. Latch
contention is indicated by a Pct Miss of greater than 1.0% or a
relatively high value in Avg Sleeps/Miss. While each latch can
indicate contention on some resource, the more common latches to
watch are:
cache buffer chain= The
cache buffer chain latch protects the hash chain of cache buffers,
and is used for each access to cache buffers. Contention for this
latch can often only be reduced by reducing the amount of access
to cache buffers. Using the X$BH fixed table can identify if some
hash chains have many buffers associated with them. Often, a
single hot block, such as an index root block, can cause
contention for this latch. Contention on this latch confirms a hot
block issue.
shared pool= The shared pool
latch is heavily used during parsing, in particular during hard
parse. If your application is written so that it generally uses
literals in stead of bind variables, you will have high contention
on this latch. Contention on this latch in conjunction with
reloads in the SQL Area of the library cache section indicates
that the shared pool is too small. You can set the cursor_sharing
parameter in init.ora to the value ‘force’ to reduce the hard
parsing and reduce some of the contention for the shared pool
latch. Applications that are coded to only parse once per cursor
and execute multiple times will almost completely avoid contention
for the shared pool latch.
Here is a partial example of the latch activity report (it is
quite long):
Pct Avg
Wait
Pct
Get Get Slps
Time NoWait NoWait
Latch
Name
Requests Miss /Miss
(s) Requests Miss
------------------------ -------------- ------ ------
------ ------------ ------
ASM
allocation
122 0.0
N/A
0
0 N/A
ASM map
headers
60 0.0
N/A
0
0 N/A
ASM map load waiting
lis
11 0.0
N/A
0
0 N/A
ASM map operation
freeli
30 0.0
N/A
0
0 N/A
ASM map operation hash
t
45,056 0.0
N/A
0
0 N/A
ASM network background
l
1,653 0.0
N/A
0
0 N/A
AWR Alerted Metric
Eleme
14,330 0.0
N/A
0
0 N/A
Consistent
RBA
107 0.0
N/A
0
0 N/A
FAL request
queue
75 0.0
N/A
0
0 N/A
FAL subheap
alocation
75 0.0
N/A
0
0 N/A
FIB s.o chain
latch
14 0.0
N/A
0
0 N/A
FOB s.o list
latch
93 0.0
N/A
0
0 N/A
JS broadcast add buf
lat
826 0.0
N/A
0
0 N/A
JS broadcast drop buf
la
826 0.0
N/A
0
0 N/A
In this example our database does not seem to be experiencing any
major latch problems, as the wait times on the latches are 0, and
our get miss pct (Pct Get Miss) is 0 also.
There is also a latch sleep breakdown report which provides some
additional detail if a latch is being constantly moved into the
sleep cycle, which can cause additional performance issues.
The latch miss sources report provides a list of latches that
encountered sleep conditions. This report can be of further
assistance when trying to analyze which latches are causing
problems with your database.
This is a series of reports that let you identify objects that
are heavily used. It contains several sub-sections like:
Segments by Logical Reads
Segments by Physical Reads
Segments by Physical Read Requests
Segments by UnOptimized Reads
Segments by Optimized Reads
Segments by Direct Physical Reads
Segments by Physical Writes
Segments by Physical Write Requests
Segments by Direct Physical Writes
Segments by Table Scans
Segments by DB Blocks Changes
Segments by Row Lock Waits
Segments by ITL Waits
Segments by Buffer Busy Waits
The "segments by logical reads" and "segments by physical reads"
reports provide information on the database segments (tables,
indexes) that are receiving the largest number of logical or
physical reads. These reports can help you find objects that are
"hot" objects in the database. You may want to review the objects
and determine why they are hot, and if there are any tuning
opportunities available on those objects (e.g. partitioning), or
on SQL accessing those objects.
For example, if an object is showing up on the physical reads
report, it may be that an index is needed on that object. Here is
an example of the segments by logical reads report:
Segments by Logical Reads
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Logical Reads | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | SIGNATURES | TABLE | 320,674,176 | 81.57 | |
| FIPFGUARD | FG_DATA | SIGNATORY | TABLE | 30,730,688 | 7.82 | |
| FIPFGUARD | FG_DATA | DIBATCH | TABLE | 6,246,576 | 1.59 | |
| FIPFGUARD | FG_DATA_ARCH | FLOWDOCUMENT_ARCH | TABLE | 6,202,256 | 1.58 | |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE300 | TABLE PARTITION | 6,134,336 | 1.56 |
Segments by Physical Reads
Queries using these segments should be analyzed to check whether
any FTS is happening on these segments. In case FTS is happening
then proper indexes should be created to eliminate FTS.
Most of these SQLs can be found under section SQL Statistics -> SQL ordered
by Reads.
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Physical Reads | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | SIGNATURES | TABLE | 320,331,032 | 77.10 | |
| FIPFGUARD | FG_DATA | SIGNATORY | TABLE | 30,610,210 | 7.37 | |
| FIPFGUARD | FG_DATA_ARCH | FLOWDOCUMENT_ARCH | TABLE | 6,056,604 | 1.46 | |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE300 | TABLE PARTITION | 360,346 | 0.09 |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE400 | TABLE PARTITION | 355,648 | 0.09 |
Several segment related reports appear providing information on:
•Segments with ITL waits
•Segments with Row lock waits
•Segments with buffer busy waits
•Segments with global cache buffer waits
•Segments with CR Blocks received
•Segments with current blocks received
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Phys Read Requests | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | SIGNATURES | TABLE | 2,509,369 | 53.38 | |
| FIPFGUARD | FG_DATA | SIGNATORY | TABLE | 266,234 | 5.66 | |
| FIPFGUARD | FG_DATA_ARCH | FLOWDOCUMENT_ARCH | TABLE | 47,508 | 1.01 | |
| FIPFGUARD | FG_DATA | ACCOUNT | TABLE | 9,017 | 0.19 | |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE400 | TABLE PARTITION | 5,806 | 0.12 |
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | UnOptimized Reads | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | SIGNATURES | TABLE | 2,509,369 | 53.38 | |
| FIPFGUARD | FG_DATA | SIGNATORY | TABLE | 266,234 | 5.66 | |
| FIPFGUARD | FG_DATA_ARCH | FLOWDOCUMENT_ARCH | TABLE | 47,508 | 1.01 | |
| FIPFGUARD | FG_DATA | ACCOUNT | TABLE | 9,017 | 0.19 | |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE400 | TABLE PARTITION | 5,806 | 0.12 |
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Direct Reads | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | SIGNATURES | TABLE | 320,331,864 | 77.14 | |
| FIPFGUARD | FG_DATA | SIGNATORY | TABLE | 30,607,876 | 7.37 | |
| FIPFGUARD | FG_DATA_ARCH | FLOWDOCUMENT_ARCH | TABLE | 6,056,604 | 1.46 | |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE300 | TABLE PARTITION | 357,576 | 0.09 |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE400 | TABLE PARTITION | 355,000 | 0.09 |
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Physical Writes | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | PROCESSLOG | TABLE | 28,619 | 0.05 | |
| FIPFGUARD | FG_DATA | UN_FD_ACCTSERIALROUTSEQNUMBER | INDEX | 5,428 | 0.01 | |
| ** MISSING ** | TEMPFG | ** MISSING: 501101/4223360 | ** MISSING ** | UNDEFINED | 2,070 | 0.00 |
| ** MISSING ** | TEMPFG | ** MISSING: 501102/4265728 | ** MISSING ** | UNDEFINED | 1,988 | 0.00 |
| SYS | SYSAUX | I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST | INDEX | 1,482 | 0.00 |
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Phys Write Requests | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | UN_FD_ACCTSERIALROUTSEQNUMBER | INDEX | 3,776 | 0.20 | |
| FIPFGUARD | FG_DATA | PROCESSLOG | TABLE | 2,619 | 0.14 | |
| SYS | SYSAUX | I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST | INDEX | 1,121 | 0.06 | |
| FIPFGUARD | FG_DATA | SIGNATURES | TABLE | 796 | 0.04 | |
| SYS | SYSTEM | HISTGRM$ | TABLE | 741 | 0.04 |
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Direct Writes | %Total |
|---|---|---|---|---|---|---|
| ** MISSING ** | TEMPFG | ** MISSING: 501101/4223360 | ** MISSING ** | UNDEFINED | 2,070 | 0.00 |
| ** MISSING ** | TEMPFG | ** MISSING: 501102/4265728 | ** MISSING ** | UNDEFINED | 1,988 | 0.00 |
| SYS | SYSAUX | WRH$_ACTIVE_SESSION_HISTORY | WRH$_ACTIVE_750434027_20743 | TABLE PARTITION | 98 | 0.00 |
| SYS | SYSAUX | SYS_LOB0000006306C00038$$ | LOB | 7 | 0.00 |
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Table Scans | %Total |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE400 | TABLE PARTITION | 6,597 | 35.61 |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE300 | TABLE PARTITION | 6,187 | 33.39 |
| FIPFGUARD | FG_DATA | SIGNATORY | TABLE | 1,508 | 8.14 | |
| FIPFGUARD | FG_DATA | SIGNATURES | TABLE | 1,508 | 8.14 | |
| FIPFGUARD | FG_INDX | FLOWDOCUMENT | FDSTATE200 | TABLE PARTITION | 501 | 2.70 |
| Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | DB Block Changes | % of Capture |
|---|---|---|---|---|---|---|
| FIPFGUARD | FG_DATA | PROCESSLOG | TABLE | 175,280 | 18.63 | |
| FIPFGUARD | FG_INDX | PK_PROCESSLOG | INDEX | 109,200 | 11.61 | |
| SYS | SYSTEM | I_H_OBJ#_COL# | INDEX | 107,232 | 11.40 | |
| SYS | SYSTEM | HISTGRM$ | TABLE | 104,688 | 11.13 | |
| FIPFGUARD | FG_INDX | FK_PROCESSLOG_PROCESSID | INDEX | 104,016 | 11.06 |
|
Owner |
Tablespace Name |
Object Name |
Subobject Name |
Obj. Type |
Row Lock Waits |
% of Capture |
|
RRA_OWNER |
RRA_DATA |
RRA_SRF_IX_04 |
|
INDEX |
6,907 |
20.18 |
|
RRA_OWNER |
RRA_INDEX |
RRA_PROCSTATUS_IX_03 |
|
INDEX |
3,918 |
11.45 |
|
RRA_OWNER |
RRA_INDEX |
RRA_REPTRN_PK |
|
INDEX |
3,118 |
9.11 |
|
RRA_OWNER |
RRA_DATA |
TRRA_BALANCE_STATUS |
|
TABLE |
1,750 |
5.11 |
|
RRA_OWNER |
RRA_INDEX |
RRA_PROCSTATUS_IX_02 |
|
INDEX |
1,178 |
3.44 |
The statistic displays segment details based on total “Row lock waits” which happened during snapshot period. Data displayed is sorted on “Row Lock Waits” column in descending order. It provides information about segments for which more database locking is happening.
DML statements using these segments should be analysed further to check the possibility of reducing concurrency due to row locking.
|
Owner |
Tablespace Name |
Object Name |
Subobject Name |
Obj. Type |
ITL Waits |
% of Capture |
|
RRA_OWNER |
RRA_INDEX |
RRA_MSGBLOBS_IX_01 |
|
INDEX |
23 |
27.06 |
|
RRA_OWNER |
RRA_INDEX |
RRA_TRN_IX_08 |
|
INDEX |
15 |
17.65 |
|
RRA_OWNER |
RRA_INDEX |
RRA_INT_CLOB_IX_01 |
|
INDEX |
10 |
11.76 |
|
RRA_OWNER |
RRA_INDEX |
RRA_TRN_IX_05 |
|
INDEX |
10 |
11.76 |
|
RRA_OWNER |
RRA_INDEX |
RRA_TRN_IX_10 |
|
INDEX |
8 |
9.41 |
Whenver a transaction modifies segment block, it first add transaction id in the Internal Transaction List table of the block. Size of this table is a block level configurable parameter. Based on the value of this parameter those many ITL slots are created in each block.
ITL wait happens in case total trasactions trying to update same block at the same time are greater than the ITL parameter value.
Total waits happening in the example are very less, 23 is the Max one. Hence it is not recommended to increase the ITL parameter value.
|
Owner |
Tablespace Name |
Object Name |
Subobject Name |
Obj. Type |
Buffer Busy Waits |
% of Capture |
|
RRA_OWNER |
RRA_INDEX |
RRA_REPTRN_PK |
|
INDEX |
4,577 |
26.69 |
|
RRA_OWNER |
RRA_INDEX |
RRA_REPBAL_IX_03 |
|
INDEX |
1,824 |
10.64 |
|
RRA_OWNER |
RRA_INDEX |
RRA_PROCSTATUS_IX_03 |
|
INDEX |
1,715 |
10.00 |
|
RRA_OWNER |
RRA_INDEX |
RRA_MSGINB_PK |
|
INDEX |
827 |
4.82 |
|
RRA_OWNER |
RRA_INDEX |
RRA_PROCSTATUS_PK |
|
INDEX |
696 |
4.06 |
Buffer busy waits happen when more than one transaction tries to access same block at the same time. In this scenario, the first transaction which acquires lock on the block will able to proceed further whereas other transaction waits for the first transaction to finish.
If there are more than one instances of a process continuously polling database by executing same SQL (to check if there are any records available for processing), same block is read concurrently by all the instances of a process and this result in Buffer Busy wait event.