V$SESSION是APPS用戶下面對於SYS.V_$SESSION 視圖的同義詞。
在本視圖中,每一個連接到數據庫實例中的session都擁有一條記錄。包括用戶session及后台進程如DBWR,LGWR,arcchiver等等。
V$SESSION中的常用列
V$SESSION是基礎信息視圖,用於找尋用戶SID或SADDR。不過,它也有一些列會動態的變化,可用於檢查用戶。如例:
SQL_HASH_VALUE,SQL_ADDRESS:這兩列用於鑒別默認被session執行的SQL語句。如果為null或0,那就說明這個session沒有執行任何SQL語句。PREV_HASH_VALUE和PREV_ADDRESS兩列用來鑒別被session執行的上一條語句。
注意:當使用SQL*Plus進行選擇時,確認你重定義的列寬不小於11以便看到完整的數值。
STATUS:這列用來判斷session狀態是:
l Achtive:正執行SQL語句(waiting for/using a resource)
l Inactive:等待操作(即等待需要執行的SQL語句)
l Killed:被標注為刪除
下列各列提供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中的連接列
- Column View Joined Column(s)
- SID V$SESSION_WAIT,V$SESSTAT,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID
- (SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
- (PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
- TADDR V$TRANSACTION ADDR
- PADDR V$PROCESS ADDR
示例:
1.查找你的session信息
- SELECTSID, OSUSER, USERNAME, MACHINE, PROCESS
- FROMV$SESSIONWHEREaudsid = userenv('SESSIONID');
2.當machine已知的情況下查找session
- SELECTSID, OSUSER, USERNAME, MACHINE, TERMINAL
- FROMV$SESSION
- WHEREterminal ='pts/tl'ANDmachine ='rgmdbs1';
3.查找當前被某個指定session正在運行的sql語句。假設sessionID為100
- selectb.sql_text
- fromv$session a,v$sqlarea b
- wherea.sql_hash_value=b.hash_valueanda.sid=100
尋找被指定session執行的SQL語句是一個公共需求,如果session是瓶頸的主要原因,那根據其當前在執行的語句可以查看session在做些什么。
視圖應用:
V$session 表的妙用
1. sid,serial#
通過sid我們可以查詢與這個session相關的各種統計信息,處理信息.
- select * from v$sesstat where sid = :sid;
- SELECT a.sid, a.statistic#, b.name, a.value
- FROM v$sesstat a, v$statname b
- WHERE a.statistic# = b.statistic#
- AND a.sid = :sid;
b. 查詢用戶相關的各種io統計信息
- select * from v$sess_io where sid = :sid;
c. 查詢用戶想在正在打開着的游標變量.
- select * from v$open_cursor where sid = :sid;
d. 查詢用戶當前的等待信息. 以查看當前的語句為什么這么慢/在等待什么資源.
- select * from v$session_wait where sid = :sid ;
e. 查詢用戶在一段時間內所等待的各種事件的信息. 以了解這個session所遇到的瓶頸
- select * from v$session_event where sid = :sid;
f. 還有, 就是當我們想kill當前session的時候可以通過sid,serial#來處理.
- alter system kill session ':sid,:serail#';
2. paddr.字段, process addr, 通過這個字段我們可以查看當前進程的相關信息, 系統進程id,操作系統用戶信息等等.
- SELECT a.pid,
- a.spid,
- b.name,
- b.description,
- a.latchwait,
- a.latchspin,
- a.pga_used_mem,
- a.pga_alloc_mem,
- a.pga_freeable_mem,
- a.pga_max_mem
- FROM v$process a, v$bgprocess b
- WHERE a.addr = b.paddr(+)
- AND a.addr = :paddr
3. command 字段, 表明當前session正在執行的語句的類型.請參考reference.
4. taddr 當前事務的地址,可以通過這個字段查看當前session正在執行的事務信息, 使用的回滾段信息等
- SELECT b.name rollname, a.*
- FROM v$transaction a, v$rollname b
- WHERE a.xidusn = b.usn
- AND a.addr = '585EC18C';
5. lockwait字段, 可以通過這個字段查詢出當前正在等待的鎖的相關信息.
- SELECT *
- FROM v$lock
- 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語句的詳細信息.
- SELECT *
- FROM v$sqltext
- WHERE address = :sql_address
- AND hash_value = :sql_hash_value;
7.ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#
可以通過這幾個字段查詢現在正在被鎖的表的相關信息.^_^
a. 首先得到被鎖的的信息
- SELECT * FROM dba_objects WHERE object_id = :row_wait_obj#;
b. 根據row_wait_file#可以找出對應的文件的信息.
- SELECT * FROM v$datafile WHERE file# = :row_wait_file#.
c. 在根據以上四個字段構造出被鎖的字段的rowid信息.
- SELECT dbms_rowid.ROWID_CREATE(1,
- :row_wait_obj#,
- :row_wait_file#,
- :row_wait_block#,
- :row_wait_row#)
- FROM dual;
8. logon_time 當前session的登錄時間.
9. last_call_et 該session idle的時間, 每3秒中更新一次.