10G V$SESSION

kewin發表於2009-11-28

10G 中V$SESSION 的變化:
在一起,我們需要聯合v$session和v$session_wait試圖來檢視某個session在等待事件。
SQL> SELECT s.sid, w.state, w.event, w.seconds_in_wait siw,
  2         s.sql_address, s.sql_hash_value hash_value, w.p1, w.p2, w.p3
  3  FROM   v$session s, v$session_wait w
  4  WHERE  s.sid = w.sid
  5  AND    s.sid = 154;

到了10G,主要檢視V$SESSION就完全可以知道session在等待什麼:
SQL> SELECT sid, state, event, seconds_in_wait siw,
  2         sql_address, sql_hash_value hash_value, p1, p2, p3
  3  FROM   v$session
  4  WHERE  sid = 154;

SID STATE   EVENT                   SIW SQL_ADDRESS      HASH_VALUE  P1   P2  P3
--- ------- ----------------------- --- ---------------- ---------- --- ---- ---
154 WAITING db file sequential read   1 000000038551E820 3625097388   4 9813   1
注意以上兩個sql的欄位是一樣,但僅僅是對V$SESSION做了查詢。

如果需要檢視事務是否被BLOCKER,以前是需要聯合V$SESSION和V$LOCK,
select
    (select username from v$session where sid=a.sid) blocker,
     a.sid,
    ' is blocking ',
     (select username from v$session where sid=b.sid) blockee,
         b.sid
from v$lock a, v$lock b
where a.block = 1
 and b.request > 0
 and a.id1 = b.id1
 and a.id2 = b.id2
到了10G,多了blocking_session 和 blocking_session_status欄位,可以知道是否被阻塞。如果blocking_session_status欄位是VALID,那一個有效的SID會出現在blocking_session 欄位。
SQL>  select sid, sql_id,  PREV_SQL_ID , BLOCKING_SESSION_STATUS , BLOCKING_SESSION ,WAIT_CLASS_ID,SECONDS_IN_WAIT   ,WAIT_CLASS   from v$session  where
  2   username='KONG';

       SID SQL_ID        PREV_SQL_ID   BLOCKING_SESSION_STATUS           BLOCKING_SESSION WAIT_CLASS_ID SECONDS_IN_WAIT WAIT_CLASS
---------- ------------- ------------- --------------------------------- ---------------- ------------- --------------- ----------------------------------------------------------------
       290 0hcsvq77pq2a8 dyk4dprp70d74 VALID                                          300    4217450380             118 Application
       300               0hcsvq77pq2a8 NO HOLDER                                             2723168908             124 Idle
可以看到290 的程式被300的程式阻塞。

在以前如果想要查詢某個session執行了那個sql語句,那需要用兩個欄位來查詢: HASH_VALUE和ADDRESS。現在只有一個SQL_ID就可以了。
SQL> select  sql_text from v$sqltext st, v$session s
  2  where (st.sql_id = s.sql_id ) and s.sid=300;

SQL_TEXT
----------------------------------------------------------------
select count(*) from t2

生活簡單就是美。

-THE END-

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40239/viewspace-620890/,如需轉載,請註明出處,否則將追究法律責任。

相關文章