可以分别从当前状态、最近状态和启动至今三个时间段来查看等待事件:
这三个状态分别对应: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 s y s t e m e v e n t 、 v system_event、v systemevent、vsession_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 s e s s i o n e v e n t 和 v session_event和v sessionevent和vsession视图进行的查询,研究具有对上面显示的内容有贡献的等待事件的会话:
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;
END
GetSQLtxt;
查询正在等待某事件的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。
————————————————
版权声明:本文为CSDN博主「Laughing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aqszhuaihuai/article/details/7029181