ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 等待事件

等待事件

原创 Linux操作系统 作者:tom_xieym 时间:2011-12-27 14:29:26 0 删除 编辑

可以分別從當前狀態、最近狀態和啟動至今三個時間段來查看等待事件:
這三個狀態分別對應: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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-05-20

  • 博文量
    77
  • 访问量
    92544