为了度量实例性能,首先要做的是确定数据库用于工作的总时间比例,与仅用于等待资源的时间比率。V$SYSMETRIC视图显示最近时间间隔的系统度量值。下面使用V$SYSMETRIC视图的査询显示一个数据库实例等待所占的时间比使用CPU的时间多:
select metric_name, value
from v$sysmetric
where metric_name in
('Database CPU Time Ratio', 'Database Wait Time Ratio')
and intsize_csec = (select max(intsize_csec) from v$sysmetric);
按等待类确定总等待与等待百分数
select wait_class,
total_waits,
round(100 * (tot_waits / sum_waits), 2) pct_totwaits,
round((time_waited / 100), 2) tot_time_waited,
round(100 * (tot_time_waited / sum_time), 2) pct_time
from (select wait_class, tot_waits, tot_time_waited
from v$system_wait_class
where wait_class != 'Idle'),
(select sum(tot_waits) sum_waits, sum(tot_time_waited) sum_time
from v$system_wait_class
where wait_class != 'Idle')
order by pct_time desc;
1.使用等待信息的v$表
记录等待信息的关键动态性能表为V$SYSTEM_EVENT、V$SESSION_EVENT、V$SESSION_WAIT和V$SESSION视图.前两个视图显示不同事件的等待时间。
V$SYSTEM_EVENT视图显示整个系统自实例启动以来所有事件的总等待时间。此视图不关注个别会话经历的等希,因此它给出的是系统的高层次等待视图。可利用这个视图来发现顶端的实例范围的等待事件。通过用所有事件的总等待时间除以事件的等待时间,计算出系统中n个顶端等待情况。
V$SYSTEM_EVENT视图的3个重要列为:total_waits,给出等待总数;time_waited,给出每个会话自实例启动认来的总等待时间:average_wait,所有会话每个事件的平均等待时间.
V$SESSION_EVENT视图类似于V$SYSTEM_EVENT视图,它显示每个会话等待的总时间。每个会话在其存在期间的所有等待事件都记录在此视图中。通过査询此视图,可找出每个会话遇到的特定瓶颈。
第3个动态视图是V$SESSION_WAIT视图,它显示会话的当前等待或刚完成的等待。这个视图中等待的信息根据系统中发生的各种等待的类型不断地变化。通过此视图中的实时信息可以了解数据库当前正在干什么。V$SESSION_WAIT视图提供等待事件的详细信息,包括文件号、闩号和块号这样的细节。V$SESSION_WAIT视图提供的这种程度的详细信息使你能侦察到减缓数据库速度的确切瓶颈.这种低层信息有助于放大引发性能问题的根本原因.
V$SESSION_WAIT视图的以下各列对于排除性能故障非常有用。
EVENT:将在下一节描述的各种等待事件(例如,闩空闲和缓冲区忙等待)。
P1、P2、P3:它们是根据不同的特定等待事件,代表不同内容的辅助参数。例如,如果等待事件为db file sequential read,则P1代表文件号,P2代表块号,P3代表块的数目。如果等待是由闩空闲事件引发的,则P1代表闩地址,P2代表闩号,P3代表事件的尝试数目。
WAIT_CLASS_ID:用于标识等待类。
WAIT_CLASS#:等待类的编号。
WAIT_CLASS:等待类的名称。
WAIT_TIME:如果状态为waited known time,这是以秒为单位的等待时间.
SECONDS_IN_WAIT:如果状态为waiting,这是以秒为单位的等待时间。
STATE:如果会话正在等待某个事件,其状态可以是waited short time、waited known time或 waiting.
第4个与等待有关的视图是V$SESSION视图。这个视图不仅提供关于会话的许多细节,而且还提供了大量等待信息。V$SESSION视图包含V$SESSION_WAIT视图的所有列,还包含其他与会话有关的大量列。
因为等待信息在V$SESSION和V$SES引ON_WAIT视图中的这种重叠,可直接使用V$SESSION视图査找大多数与等待相关的信息而不用使用V$SESSION_WAIT视图。可首先査询V$SYSTEM_EVENT视图开始分析系统中的等待事件,看数据库中是否有任何重大的等待事件发生.可执行代码清单20.15中给岀的査询来完成此项工作。
使用V$SYSTEM_EVENT 视图査看等待事件
SELECT event, time_waited, average_wait
FROM V$SYSTEM_EVENT
GROUP BY event, time_waited, average_wait
ORDER BY time_waited DESC;
2.获得等待信息
要获得等待信息很简单,只需査询相应的动态性能视图即可。例如,如果希望快速找岀不同用户会话(会话级的等待信息)所面临的等待类型,以及他们执行的sql语句文本,可使用下面的査询:
select s.username, t.sqltext, s.event
from v$session s, v$sqltext t
where s.sql_hash_value = t.hash_value
and s.sql_address = t.address
and s.type <> 'BACKGROUND'
order by s.sid, t.hash_value, t.piece;
注解 需要通过设置初始化参数TIMED_STATISTICS为TRUE或设置初始化参数STATISTICS_LEVEL为TYPICAL或ALL,打开统计数据收集。
如果想要,一个简明的实例范围的等待事件状态,从而显示哪些事件是总等待时间的最大贡献者,可使用代码清单20-16所示的査询(输出中列出了几个空闲等待事件,但在这里并未显示)。
按总等待时间排序的实例范围的等待
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;
首先,査看V$SYSTEM_EVENT视图,按等待时间总量排列前面的等待事件以及事件的平均等待时间。根据总等待时间的百分比研究前面的等待。也可以査看AWR报告,因为AWR也列出了实例中前5个等待事件。
接着,在列表的前面找出具体等待事件的细节.例如,如果最前面的等待事件为缓冲区忙等待,则査询V$WAITSTAT视图,右什么类型的缓冲区块(数据块、撤销块等)导致缓冲区忙等待(简单的SELECT * FROM V$WAITSTAT 将给岀所有必要的信息).例如,如果撤销块缓冲区等待占缓冲区忙等待的大多数,则应是撤销段有问题,而不是数据块有问题。
最后,使用V$SESSION视图找出可能是问题根源的具体对象。例如,如果有大量db file scattered read类型的等待,V$SESSION视图将提供等待事件中涉及的文件号和块号。在下面的例子中,用V$SESSION视图来找出谁正在进行导致目前最重要的等待事件的全表扫描。如前所述,db file scattered read等待事件由全表扫描所引起。
SELECT sid, sql_address, sql_hash_value FROM V$SESSION WHERE event='db file scattered read';
下面的例子说明如何找出一个给定会话的当前等待事件:
SELECT sid, state, event, wait-time, seconds_in_wait
FROM v$session
WHERE sid=1418;
WAIT_TIME列下方的0偵表示这个会话的等待事件db file sequential read正在进行。在等待事件结束时,糸看到WAIT_TIME和SECONDS_IN_WAIT列的值。
还可以使用V$SQLAREA视图找出哪些SQL语句导致高磁盘读取。如果闩等待起主导作用,则应该査看V$LATCH视图,以获得导致高闩等待时间的闩类型的信息:
SELECT sid, blocking_session, username,event, seconds_in_wait
FROM V$SESSION
WHERE blocking_session_status = 'VALID';
3.V$SESSION_WAIT_HISTORY 视图
V$SESSION_WA1T_HISTORY视图保存每个活动会话的last ten wait events (最后10个等待事件)的有关信息。其他与等待有关的视图,如V$SESSION和V$SESSION_WAIT只显示最近一次等待的信息。最近等待可能是一个较短的等待,因此,它会跳过你的监视。下面给出一个使用V$SESSION_WAIT_HISTORY视图的样例査询:
SELECT seq#, event, wait_time, pl, p2, p3
FROM V$SESSION_WAIT_HISTORY
WHERE sid = 988
ORDER BY seq#;
请注意,WAIT_TIME列下方的0值表示会话正在等待一个特定的等待事件。非零值代表上一个事件等待的时间。
4.用活动会话历史来分析等待
V$SESSION_WAIT视图告诉你一个会话正在等待的资源。V$SESSION视图还提供关于活动会话的重要信息。但亙,这两个视图都不提供实例中等待的历史记录信息。等待结束后,就不能使用V$SESSION_WAIT视图査看等待信息了。等待是很短暂的,在査询视图时,等待多半己经结束。
新的ASH通过记录会话信息,允许你及时返回并查看数据库中某个性能瓶颈的历史信息。虽然AWR默认提供实例每小时的快照,但也不能根据AWR数据分析发生在5分钟或10分钟前的事件。到了ASH信息发挥作用的时候了。ASH按秒对V$SESSION视图进行釆样,并收集所有活动会话的等待信息。
活动会话指位于CPU上或正等待资源的会话。可通过视图V$ACTIVE_SESSION_H1STORY(它包含实例中每个会话的一行)査看ASH会话统计数据。ASH是内存中的一个滚动的缓冲区,旧信息被新信息覆盖。
每60分钟,MMON后台进程都要刷新过滤了的ASH数据到磁盘,使其成为按小时的AWR快照的一部分。如果ASH缓冲区已满,则MMNL后台进程进行数据的刷新。ASH数据被刷新到磁盘后,就不能在V$ACTIVE_SESSION_HISTORY视图中看到它了。现在要査看历史数据,必须使用DBA_HIST_ACTIVE_SESS_HISTORY视图。
5.使用V$ACTIVE_SESSION_HISTORY视图
V$ACTIVE_SESSION_HISTORY视图提供了ASH数据上的一个窗口,这些ASH数据是在将其作为每小时的AWR快照的部分被刷新前由Oracle实例保存在内存中的。可使用它来获得诸如消耗数据库中大部分资源的SQL、导致大多数等待的特定对象以及等待最多的用户的身份等信息。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




