如何监控等待事件

如何监控等待事件

 

可以分别从当前状态、最近状态和启动至今三个时间段来查看等待事件:

 

这三个状态分别对应:v$session/v$session+v$session_wait[当前状态]、v$session_wait_history[最近状态]和v$session_event[启动至今]三个性能视图。

 

从10g开始v$session包含了v$session_wait的所有字段,所以对于当前状态,10g以后可以直接查看v$session,而10g之前可通过v$session和v$session_wait关联达到同样的效果。

 

v$session_wait_history记录了每个active session的最近10次的等待事件。如果查询某个session的等待事件频繁发生,则反映在v$session_wait_history的最近10条记录上则几乎是同一个等待事件。

 

v$session_event则记录了实例启动至今所有等待事件的等待次数、等待时间等的统计信息。可以根据等待次数或者等待时间进行排序,类似AWR report或者Statspack中的TOP 5 Waits,就可以大致反映出常态下数据库主要在等待哪些操作的完成,从而给数据库的进一步优化提供方向。

 

v$system_event视图提供自实例启动以来所有等待事件的汇总。

V$SESSION_WAIT显示活动会话正在等待的事件或资源。

V$SESSION_EVENT显示实例启动以来会话等待的所有事件的汇总。

 

从Oracle 等待接口v$system_event、v$session_event和v$session_wait中获得等待事件,进而找出影响性能的对象和sql语句

方法:

-- 首先,利用v$system_event视图执行下面的查询查看数据库中某些常见的等待事件:

SELECT *

  FROM v$system_event

 WHERE event IN ('buffer busy waits',

                 'db file sequentialread',

                 'db file scatteredread',

                 'enqueue',

                 'free buffer waits',

                 'latch free',

                 'log file parallelwrite',

                 'log file sync');

ORDER BY TOTAL_WAITS DESC;

 

-- 接着,利用下面对v$session_event和v$session视图进行的查询,研究具有对上面显示的内容有贡献的等待事件的会话:

SELECT se.sid,

       s.username,

       se.event,

      se.total_waits,

      se.time_waited,

      se.average_wait

  FROM v$session s,v$session_event se

 WHERE s.sid = se.sid

   AND se.event NOT LIKE 'SQL*Net%'

   AND s.status = 'ACTIVE'

   AND s.username IS NOT NULL

 ORDER BY time_waited DESC;

 

-- 使用下面查询找到与所连接的会话有关的当前等待事件。这些信息是动态的,为了查看一个会话的等待最多的事件是什么,需要多次执行此查询。

SELECT sw.sid,

       s.username,

       sw.event,

      sw.wait_time,

       sw.state,

      sw.seconds_in_wait SEC_IN_WAIT

  FROM v$session s,v$session_wait sw

 WHERE s.sid = sw.sid

   AND sw.event NOT LIKE 'SQL*Net%'

   AND s.username IS NOT NULL

 ORDER BY sw.wait_time DESC;

 

-- 查询会话等待事件的详细信息

SELECT sid, event, p1text, p1,p2text, p2, p3text, p3

  FROM v$session_wait

 WHERE sid BETWEEN &1 AND &2

   AND event NOT LIKE '%SQL%'

   AND event NOT LIKE '%rdbms%';


-- 利用P1、P2的信息,找出等待事件的相关的段

SELECT owner, segment_name, segment_type, tablespace_name

  FROM dba_extents

 WHERE file_id =&fileid_in

   AND &blockid_in BETWEEN block_id AND block_id + blocks -1;


-- 获得操作该段的sql语句:

SELECT sid,getsqltxt(sql_hash_value, sql_address)

  FROM v$session

 WHERE sid = &sid_in;


--getsqltxt函数

CREATE OR REPLACE FUNCTIONGetSQLtxt(hashaddr_in IN v$sqltext.hash_value%TYPE,

                                    addr_in     IN v$sqltext.address%TYPE)

  RETURN VARCHAR2 IS

  temp_sqltxt VARCHAR2(32767);

  CURSOR sqlpiece_cur IS

    SELECT piece, sql_text

      FROM v$sqltext

     WHERE hash_value = hashaddr_in

       AND address = addr_in

     ORDER BY piece;

BEGIN

  FOR sqlpiece_rec IN sqlpiece_cur LOOP

    temp_sqltxt := temp_sqltxt ||sqlpiece_rec.sql_text;

  END LOOP;

  RETURN temp_sqltxt;

ENDGetSQLtxt;

 

--查询正在等待某事件的sql

SELECT sql_text

  FROM V$sqlarea

 WHERE (address, hash_value) IN

       (SELECT sql_address, sql_hash_value

          FROM v$session

         WHERE event LIKE 'file%');

如果使用9i请关联v$session_wait。


整理自网络 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值