Oracle V$SESSION詳解

V$SESSION是APPS用戶下面對於SYS.V_$SESSION 視圖的同義詞。sql

 

在本視圖中,每個鏈接到數據庫實例中的session都擁有一條記錄。包括用戶session及後臺進程如DBWR,LGWR,arcchiver等等。數據庫

 

 

V$SESSION中的經常使用列c#

 

V$SESSION是基礎信息視圖,用於找尋用戶SID或SADDR。不過,它也有一些列會動態的變化,可用於檢查用戶。如例:服務器

SQL_HASH_VALUE,SQL_ADDRESS:這兩列用於鑑別默認被session執行的SQL語句。若是爲null或0,那就說明這個session沒有執行任何SQL語句。PREV_HASH_VALUE和PREV_ADDRESS兩列用來鑑別被session執行的上一條語句。session

注意:當使用SQL*Plus進行選擇時,確認你重定義的列寬不小於11以便看到完整的數值。oracle

STATUS:這列用來判斷session狀態是:spa

l        Achtive:正執行SQL語句(waiting for/using a resource)操作系統

l        Inactive:等待操做(即等待須要執行的SQL語句).net

l        Killed:被標註爲刪除blog

下列各列提供session的信息,可被用於當一個或多個combination未知時找到session。

Session信息

l        SID:SESSION標識,經常使用於鏈接其它

l        SERIAL#:若是某個SID又被其它的session使用的話則此數值自增長(當一個       SESSION結束,另外一個SESSION開始並使用了同一個SID)。

l        AUDSID:審查session ID惟一性,確認它一般也用於當尋找並行查詢模式

l        USERNAME:當前session在oracle中的用戶名。

Client信息

數據庫session被一個運行在數據庫服務器上或從中間服務器甚至桌面經過SQL*Net鏈接到數據庫的客戶端進程啓動,下列各列提供這個客戶端的信息

l        OSUSER:  客戶端操做系統用戶名

l        MACHINE:客戶端執行的機器

l        TERMINAL:客戶端運行的終端

l        PROCESS:客戶端進程的ID

l        PROGRAM:客戶端執行的客戶端程序

要顯示用戶所鏈接PC的TERMINAL、OSUSER,需在該PC的ORACLE.INI或Windows中設置關鍵字TERMINAL,USERNAME。

Application信息

調用DBMS_APPLICATION_INFO包以設置一些信息區分用戶。這將顯示下列各列。

l        CLIENT_INFO:DBMS_APPLICATION_INFO中設置

l        ACTION:DBMS_APPLICATION_INFO中設置

l        MODULE:DBMS_APPLICATION_INFO中設置

下列V$SESSION列一樣可能會被用到:

l        ROW_WAIT_OBJ#

l        ROW_WAIT_FILE#

l        ROW_WAIT_BLOCK#

l        ROW_WAIT_ROW#

V$SESSION中的鏈接列

 

  1. Column                                         View                                  Joined Column(s)  
  2.   
  3. SID                  V$SESSION_WAIT,V$SESSTAT,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR   SID  
  4.   
  5. (SQL_HASH_VALUE, SQL_ADDRESS)        V$SQLTEXT, V$SQLAREA, V$SQL                     (HASH_VALUE, ADDRESS)  
  6.   
  7. (PREV_HASH_VALUE, PREV_SQL_ADDRESS)  V$SQLTEXT, V$SQLAREA, V$SQL                     (HASH_VALUE, ADDRESS)  
  8.   
  9. TADDR                                V$TRANSACTION                                    ADDR  
  10.   
  11. PADDR                                V$PROCESS                                        ADDR  

  

 

示例:

1.查找你的session信息

 

  1. SELECTSID, OSUSER, USERNAME, MACHINE, PROCESS  
  2.   
  3. FROMV$SESSIONWHEREaudsid = userenv('SESSIONID');  

 

 

2.當machine已知的狀況下查找session

 

  1. SELECTSID, OSUSER, USERNAME, MACHINE, TERMINAL  
  2.   
  3. FROMV$SESSION  
  4.   
  5. WHEREterminal ='pts/tl'ANDmachine ='rgmdbs1';  

 

 

3.查找當前被某個指定session正在運行的sql語句。假設sessionID爲100

    

  1. selectb.sql_text  
  2.   
  3. fromv$session a,v$sqlarea b  
  4.   
  5. wherea.sql_hash_value=b.hash_valueanda.sid=100  

 

 

尋找被指定session執行的SQL語句是一個公共需求,若是session是瓶頸的主要緣由,那根據其當前在執行的語句能夠查看session在作些什麼。

視圖應用:

 

 

V$session 表的妙用

v$session 表中比較經常使用的幾個字段說明:

1. sid,serial#
經過sid咱們能夠查詢與這個session相關的各類統計信息,處理信息.

    
  1. select * from v$sesstat where sid = :sid;   
  查詢用戶相關的各類統計信息. 
   
  1. SELECT a.sid, a.statistic#, b.name, a.value  
  2.   FROM v$sesstat a, v$statname b  
  3.  WHERE a.statistic# = b.statistic#  
  4.    AND a.sid = :sid;    

b. 查詢用戶相關的各類io統計信息
   
  1. select * from v$sess_io where sid = :sid;  
 
c. 查詢用戶想在正在打開着的遊標變量.
   
  1. select * from v$open_cursor where sid = :sid;  


d. 查詢用戶當前的等待信息. 以查看當前的語句爲何這麼慢/在等待什麼資源.
    
  1. select * from v$session_wait where sid = :sid ;  

e. 查詢用戶在一段時間內所等待的各類事件的信息. 以瞭解這個session所遇到的瓶頸
    
  1. select * from v$session_event where sid = :sid;  

f. 還有, 就是當咱們想kill當前session的時候能夠經過sid,serial#來處理.
    
  1. alter system kill session ':sid,:serail#';  

2. paddr.字段, process addr, 經過這個字段咱們能夠查看當前進程的相關信息, 系統進程id,操做系統用戶信息等等.
    
  1. SELECT a.pid,  
  2.        a.spid,  
  3.        b.name,  
  4.        b.description,  
  5.        a.latchwait,  
  6.        a.latchspin,  
  7.        a.pga_used_mem,  
  8.        a.pga_alloc_mem,  
  9.        a.pga_freeable_mem,  
  10.        a.pga_max_mem  
  11.   FROM v$process a, v$bgprocess b  
  12.  WHERE a.addr = b.paddr(+)  
  13.    AND a.addr = :paddr  

3. command 字段, 代表當前session正在執行的語句的類型.請參考reference.

4. taddr 當前事務的地址,能夠經過這個字段查看當前session正在執行的事務信息, 使用的回滾段信息等
    
  1. SELECT b.name rollname, a.*  
  2.   FROM v$transaction a, v$rollname b  
  3.  WHERE a.xidusn = b.usn  
  4.    AND a.addr = '585EC18C';  

5. lockwait字段, 能夠經過這個字段查詢出當前正在等待的鎖的相關信息.
    
  1. SELECT *  
  2.   FROM v$lock  
  3.  WHERE (id1, id2) = (SELECT id1, id2 FROM v$lock WHERE kaddr = '57C68C48')  

6. (sql_address,sql_hash_value) (prev_sql_addr,prev_hash_value) 根據這兩組字段, 咱們能夠查詢到當前session正在執行的sql語句的詳細信息.
    
  1. SELECT *  
  2.   FROM v$sqltext  
  3.  WHERE address = :sql_address  
  4.    AND hash_value = :sql_hash_value;  

7.ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#
能夠經過這幾個字段查詢如今正在被鎖的表的相關信息.^_^
a. 首先獲得被鎖的的信息
  
  1. SELECT * FROM dba_objects WHERE object_id = :row_wait_obj#;  

b. 根據row_wait_file#能夠找出對應的文件的信息.
  
  1. SELECT * FROM v$datafile WHERE file# = :row_wait_file#.  

c. 在根據以上四個字段構造出被鎖的字段的rowid信息.
  
  1. SELECT dbms_rowid.ROWID_CREATE(1,  
  2.                                :row_wait_obj#,  
  3.                                :row_wait_file#,  
  4.                                :row_wait_block#,  
  5.                                :row_wait_row#)  
  6.   FROM dual;  

8. logon_time 當前session的登陸時間.
9. last_call_et 該session idle的時間, 每3秒中更新一次.
相關文章
相關標籤/搜索