可以分別從當前狀態、最近狀態和啟動至今三個時間段來查看等待事件:
這三個狀態分別對應: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
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 ='316'
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 =58
AND 158185 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 'db file%');
轉載于網上。。。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25850100/viewspace-714001/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25850100/viewspace-714001/