Introduction
I can be a bit "old school" at times on some things, and I like to be familiar with the underlying technology being used by advanced features. So while using Enterprise Manager to see what is happening on your database can be easier and quicker than running queries manually, there may be times when EM is not available on a particular database or it doesn't provide a particular piece of information you are after. Knowing where this information is held in the database instance lets you go direct to the source to get what you need, which can either be quicker in some circumstances or the only option in other cases.The key information about activity on a database instance is available in a handful of dynamic performance views. While using Enterprise Manager can be quicker and easier, don't be afraid of these dynamic performance views. Learn about them and what is in them and they can be your friends, and not your enemies.
Generally I break these activity related views down into current, real time activity happening now and historical activity that happened some time ago. And the historical activity can be further split into very recent as opposed to long ago activity, where "long ago" is probably more than an hour ago.
Current Session Activity
The main view has to beV$SESSION
, which has a record per connected session. You can query V$SESSION
to see what each session is currently doing (the SQL it is executing
(if any), or if it is waiting or blocked, or idle), or query it
repeatedly to see how a session changes over time (blocked or moving
through different SQL).This view has been expanded over the different versions of Oracle and now includes a richer set of data about what each session is doing spread across a number of useful columns e.g.
STATUS
, TYPE
, SQL_ID
, SQL_CHILD_NUMBER
, ROW_WAIT_*
, BLOCKING_SESSION
, EVENT
, WAIT_TIME
, SECONDS_IN_WAIT
, STATE
.When a session waits for something to complete, such as a disk wait, you can see this wait in
V$SESSION
.
But this is transitory, being about the current wait that session is
experiencing. These session wait times are also cumulatively recorded
in V$SESSION_EVENT
, which records both the wait event and
the total wait time since the session connected to Oracle. You cannot
just use the current, total values in this, as they are cumulative since
the session was created. However you can compare the changes to this
over a short period of time, which will tell you the events that the
session waited on during that period of time, and how long it waited for
them. Tanel Poder has given us the very useful snapper.sql
script that snapshots this dynamic performance view in real time and
reports on what changed i.e. the waits a session is experiencing.Recent Active Session Activity
In version 10 (10.1) Oracle added in the new dynamic performance view ofV$ACTIVE_SESSION_HISTORY
(ASH), which contains point in time snapshot copies of data from V$SESSION
. The idea is that you can now look back over recent history to see what was happening recently in individual sessions, letting you investigate issues soon after
they have happened. Potentially it also lets you investigate temporary
problems that do not persist long enough to investigate in real time
using V$SESSION
directly. The manual says "It contains snapshots of active database sessions taken once a second. A database session is considered active if it was on the CPU or was waiting for an event that didn't belong to the
Idle
wait class."
The one snapshot every second is to minimise any performance impact on
the system and the storage requirements, and it also only saves the
data for active sessions i.e. nothing is copied for inactive, idle
sessions. The data from each snapshot is then held in memory within the
SGA, and accessible via the dynamic performance view of V$ACTIVE_SESSION_HISTORY
. There is a limit to how much memory it will use, but it is intended to cover the past 30 minutes.Note that Active Session History and AWR (Automatic Workload Repository) are part of the "Oracle Diagnostic Pack", and a license for this must be purchased before you have the right to use either of these i.e. these features are not part of the core Oracle Database license. And such additional "Packs" are only available for the Enterprise Edition of the Oracle Database.
Most of the columns in
V$ACTIVE_SESSION_HISTORY
are the same as in V$SESSION
, with the addition of a SAMPLE_TIME
column. You can query this in similar ways to how you might query V$SESSION
, but with the addition of a SAMPLE_TIME
column, and that the same SESSION_ID
can be repeated across different samples. Using ASH you can do things
such as identifying the most frequent wait events, or sessions
experiencing a specific wait event, or any session experiencing long
waits.Historical Session Activity
As stated, the data inV$ACTIVE_SESSION_HISTORY
is held in memory in the SGA and is limited in size. Oracle will also
automatically save 10% of this data to a table on disk in the AWR
(Automatic Workload Repository), so you have an even longer period of
history to query (up to the AWR retention limits) but at a lower sample
rate. Even though the sample rate is much lower, the idea is that any
peaks in activity or contention will still be captured and be available
for analysis later on in DBA_HIST_ACTIVE_SESS_HISTORY
.The actual way it decides what samples to save is somewhat complicated i.e. not just a straight "1 in 10" of the samples from the in-memory ASH. It saves 1 in 10 of the sample sets when there was activity, but saves all of the session data from such a saved sample. This way you get all of the active session data from a saved sample, rather than just 1 in 10 of the active sessions and so be missing a complete picture of a sample set.
You can query
DBA_HIST_ACTIVE_SESS_HISTORY
in much the same way as you would query V$ACTIVE_SESSION_HISTORY
, except that there are fewer samples covering longer periods of time.Historical System Activity
The previous views are all about individual sessions, but Oracle also has a lot of information about other activity on the database as a whole in the other dynamic performance views. Most of these hold cumulative values - the data values only ever go up as new measurements are added in. In many cases their data is essentially a sum of the activity across all of the sessions in the system. These views can provide other useful information about what has been happening on a system. Oracle also takes snapshots of these data sets into the AWR, into a series ofDBA_HIST_*
tables, which you again need the Diagnostics Pack license for the right to query them. The default snapshot interval is every hour, and they are retained for 7 days (these can be changed if desired, which can be useful). An AWR snapshot copies all data in all of the relevant dynamic performance views into their corresponding
DBA_HIST_
table with a SNAP_ID
column added in to identify the relevant snapshot. Unlike ASH, which is
only a sampled subset, all of the data in the corresponding dynamic
performance views is saved on each snapshot, so there are no issues over
any missing data within a snapshot.You can make use of this AWR data either by running a standard AWR report which summarises all activity between two snapshots, or by writing your own queries directly against these
DBA_HIST_*
tables for things of interest to
you. The latter can be useful if you don't want to have to produce a
set of AWR reports and then read through them manually to find something
of interest. The right kind of queries can summarise key activity data
across multiple snapshots, helping you identify any abnormalities or
peak activity periods or anything else of interest.In the same way that you might look at a dynamic performance view to see changes in real time, you can query the corresponding
DBA_HIST_*
table to see what changed over longer periods of time and between
multiple snapshots. But your query will need to get two sets of
snapshots (using the SNAP_ID
column probably) and subtract
the cumulative values of one from the other to get the change in value
over that time i.e. the actual measure of the activity over that period
of time. I've blogged about querying the AWR DBA_HIST_ tables directly before.For reference here are a few dynamic performance views and the corresponding
DBA_HIST_
table they get saved to by an AWR snapshot:V$SYSSTAT
(individual named system statistic counters) maps toDBA_HIST_SYSSTAT
V$SYSTEM_EVENT
(wait event occurrence and time counters) maps toDBA_HIST_SYSTEM_EVENT
and toDBA_HIST_BG_EVENT_SUMMARY
for Background eventsV$SQL
has no direct map, butV$SQLSTATS
maps toDBA_HIST_SQLSTAT
SQL Statements Executed
The other approach to investigating performance problems is to look at the SQL statements being executed, as opposed to what individual sessions are doing or the system as a whole. The most relevant dynamic performance views for SQL execution information are:V$SESSION
- contains theSQL_ID
of the SQL statement a session is currently executing (if any)V$SQL
andV$SQLSTATS
for all SQL statements recently executed, with execution statistics, etc.- Data columns include:-
SQL_TEXT
,CHILD_NUMBER
,USERS_EXECUTING
,EXECUTIONS, FETCHES, BUFFER_GETS, CPU_TIME, ROWS_PROCESSED
- Remember that these activity counters are cumulative and simply increase in value on each execution of that SQL statement
- SQL statements are retained in
V$SQL
while they are being executed, but after that they can be removed for that slot to be reused by another SQL statement. So there is no guarantee thatV$SQL
contains all SQL statements recently executed - However, the most frequently executed SQL statements will tend to remain in
V$SQL
- Data columns include:-
Summary
The following dynamic performance views and AWR tables can directly provide you with information about what is and what has happened on an Oracle database instance, and are extremely useful for investigating performance problems. Remember that to use some of these you must have purchased the Diagnostics Pack for your Enterprise Edition Oracle database software.V$SESSION
for what is happening now in each sessionV$SESSION_EVENT
for total waits a session has experiencedV$ACTIVE_SESSION_HISTORY
for recent session historyDBA_HIST_ACTIVE_SESS_HISTORY
for a sampled subset of session history over a longer period of timeDBA_HIST_SYSSTAT
,DBA_HIST_SYSTEM_EVENT
,DBA_HIST_SQL_STAT
andDBA_HIST_SYS_TIME_MODEL
in the AWR for full copies of the corresponding dynamic performance view taken at regular intervalsV$SQL
andV$SQLSTATS
for the most recently executed SQL statements, still present in the shared pool in the SGA