6.具有最高等待的对象
下面的査询确定导致最多等待的对象以及这些对象在最后15分钟内等待的事件类型:
select o.object_name,
o.object_type,
a.event,
sum(a.wait_time + a.time_waited) total_wait_time
from
v$active_session_history a, dba_objects o
where
a.sample_time between sysdate - 15 / 1440 and sysdate
and
a.current_obj# = o.object_id
group by
o.object_name, o.object_type, a.event
order by
total_wait_time;
•最重要的等待事件
下面的查询列出数据库中最后15分钟内最重要的等待事件:
select a.event,
sum(a.wait_time +
a.time_waited) total_wait_time
from v$active_session_history a
where a.sample_time between
sysdate - 15/1440 and sysdate
group by a.event
order by total_wait_time desc;
•等待最多的用户
下面的査询列岀最后15分钟内等待次数最多的用户:
select s.sid, s.username,
sum(a.wait_time +
a.time_waited) total_wait_time
from v$active_session_history a,
v$session s
where a.sample_time between sysdate - 15/1440
and sysdate
and a.session_id=s.sid
group by s.sid, s.username
order by total_wait_time desc;
•确定等待最多的sql
使用下面的査询,可确定实例中等待最多的sql。样本时间为最后15分钟。
select a.user_id,d.username,s.sql_text,
sum(a.wait_time + a.time_waited) total_wait_time
from v$active_session_history a,
v$sqlarea s,
dba_users d
where a.sample_time between sysdate - 15/1440
and sysdate
and a.sql_id = s.sql_id
and a.user_id = d.user_id
group by a.user_id,s.sql_text, d.username;
7.等待类及与等待有关的视图
V$SESSION_WAIT视图显示活动会话正在等待的事件和资源。使用V$SESSION_WAIT视图,还可以了解到会话等待属于何种等待类。下面是一个例子:
SELECT wait_class, event, sid, state, wait_time,
seconds_in_wait
FROM v$session_wait
ORDER BY wait_class, event, sid;
此査询指出,最重要的等待出现在Application等待类中。
V$SYSTEM_WAIT_CLASS 视图给出按等待类的等待分解,如下所示:
SELECT wait_class, time_waited
FROM v$system_wait_class
ORDER BY time_waited DESC;
V$SESSION_WAIT_CLASS 视图按单个会话给出每种等待类所花的总时间。下面给出一个例子:
SELECT wait_class, time_waited
FROM v$session_wait_class
WHERE sid = 1053
ORDER BY time_waited DESC;
V$WAITCLASSMETRIC 视图显示最近60秒时间间隔中等待类的度量值。此视图保存最多一个小时的信息。下面是使用此视图的进行査询的例子:
SELECT WAIT_CLASS#,
WAIT_CLASS_ID,dbtime_in_wait,time_waited,wait_count
FROM v$waitclassmetric
ORDER BY time_waited DESC;
8.考察段级统计数据
不管是使用AWR还是使用与等待有关的V$视图,都找不到关于某个等待事件发生在何处的信息。例如,可从V$SYSTEM_EVENT视图看到缓冲区忙等待事件有问题,而且你也知道要通过从手动段空间管理切换到ASSM (Automatic Segment Space Management,自动段空间管理)来减少这些等待。但是,不管是AWR还是相应的V$视图都没有指出应该研究哪些表或索引以解决高等待事件。Oracle提供 了3个v$视图,帮助下探到段级(segment level)。
段级动态性能视图为V$SEGSTAT_NAME、V$SEGSTAT和V$SEGMENT_STATISTICS。使用它们可找岀哪些表和索引正在使用大量资源或具有大量的等待。知道了是由于高等待引起性能问题后,可使用这些段级视图来准确地找出是哪个表或索引存在问题,并处理该对象以减少等待,提高数据库的性能。V$SEGMENT_NAME视图提供收集到的所有段级的列表,并告诉你是否进行了釆样统计。
我们来看一下在系统中出现大量等待事件时,如何使用这些段级视图。假如使用V$SYSTEM_EVENT视图,发现存在大量的缓冲区忙等待。现在应该用如下的査询来査看V$SEGMENT_STATISTICS视图,找出哪个对象是导致高缓冲区忙等待的根源。然后如本章稍后的“重要的Oracle等待事件”部分中所述,确定对这类等待事件所釆取的恰当的修正措施。
SELECT owner, object_name, object_type,
tablespace_namc
FROM V$SEGMENT_STATISTICS
WHERE statistic_name='buffer busy waits'
ORDER BY value DESC;
9.收集详细的等待事件信息
从v$动态性能视图选择数据并解释它们的意思并不总是那么容易的。因为视图是动态的,它们所包含的信息经常随Oracle更新每个等待事件的基表而变化。而且,前面査看的与等待有关的动态性能视图并不提供诸如绑定变量信息等关键数据。要得到更详细的等待信息,可使用以下几节描述的方法。
•方法1:使用Oracle事件10046跟踪SQL代码
可使用一个称为10046 Trace的特殊跟踪获得所有种类的绑定变量信息,10046 trace比第19章中介绍的SQL trace要先进得多。使用这个跟踪产生一个到跟踪目录的输出文件的写操作。通过指定各种级別,可以用多种方式设置10046 trace,级别越高,提供的信息越详细(下面的案例仅作为一个例子使用级别12,它提供远超出需要的详细信息。级別4给出详细的绑定值信息,而级别8给出等待信息)。
可按如下方式使用alter session语句:
alter session set events '10046 trace name
context forever level 12';
也可以在init.ora文件中插入下面的行:
event = 10046 trace name context forever, level
12
•方法2:使用Oradebug实用程序进行跟踪
可如下例所示使用oradebug实用程序:
ORADEBUG SETMYPID
ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER
LEVEL 8;
在此例中,SETMYPID表示你想跟踪当前会话。如果想跟踪另一个会话,请使用SETOSPID <Process Id>.
•方法3:使用 DBMS_SYSTEM 程序包设置跟踪
使用DBMS_SYSTEM程序包的SET_EV过程,可在任意会话中设置跟踪,如下例所示:
SQL> EXECUTE SYS.DBMS_SYSTEM.SET_EV(9,271,10046,12,'');
•方法4:使用DBMS_MONITOR程序包
DBMS_MONITOR程序包提供收集扩充会话跟踪信息的一种简单的方法。使用DBMS_MONITOR.SESSION_TRACE_ENABLE程序包启用一个用户的会话跟踪。
如果设置WAITS参数为TRUE,则跟踪将包含等待信息。同样,设置BINDS参数为TRUE将提供被跟踪会话的绑定信息。
如果不设置SESSION_ID参数或将其设置为NULL,将跟踪当前会话。如下使用DBMS_MONITOR程序包进行跟踪:
execute dbms_monitor.session_trace_enable
(waits=>TRUE, binds=>TRUE);
除前面这些收集等待信息的方法外,还可以使用方便的OEM Database Control工具,它允许从 Database Control主页査看各个条目。
注解 使用awrrpt.sql脚本获得的AWR报告和用addmrpt.sql脚本获得的ADDM报告都包含大量等待信息。




