如何监控等待事件

来源:互联网 发布:小学体育课程优化整合 编辑:程序博客网 时间:2024/05/27 06:14

如何监控等待事件

 

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

 

这三个状态分别对应: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。


整理自网络 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 八个月不吃辅食怎么办 孩子长得太快怎么办 反复发烧到39度怎么办 儿童发烧到39度怎么办 7岁儿童发烧40度怎么办 7岁反复发烧39度怎么办 宝宝烧到39.5度怎么办 3岁儿童发烧39度怎么办 孩子发高烧怎么办39度5 3岁宝宝不吃水果怎么办 2岁宝宝不吃水果怎么办 4岁宝宝不吃水果怎么办 过早竖抱婴儿了怎么办 3个月宝宝认生怎么办 10天婴儿不拉屎怎么办 3个月宝宝不吃奶粉怎么办 婴儿吃青菜吃多怎么办 2月宝宝消化不好怎么办 吃母乳的宝宝便秘怎么办 婴儿拉肚子怎么办大便绿色的 10个月宝宝睡眠不好怎么办 婴幼儿消化不良引起的腹泻怎么办 小孩晚上睡觉不盖被子怎么办 镜子对着房间门怎么办 高血压引起的眼底出血怎么办 墙砖颜色选深了怎么办 墙砖颜色太深怎么办 30岁了没有朋友怎么办 产检宝宝腿短怎么办 2岁宝宝不学说话怎么办 4岁了还不会说话怎么办 两周岁还不说话怎么办 2岁了不会说话怎么办 一岁宝宝蛀牙了怎么办 分手了想联系他怎么办 和婆家人闹翻了怎么办 2岁宝宝不好断奶怎么办 2岁宝宝断奶哭闹怎么办 脑子感觉变笨了怎么办 5岁数学不开窍怎么办 小孩拼音太差了怎么办