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)</p><p>SID V$SESSION_WAIT,V$SESSTAT,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID</p><p>(SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)</p><p>(PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)</p><p>TADDR V$TRANSACTION ADDR</p><p>PADDR V$PROCESS ADDR</p><p>
樣本:
1.尋找你的session資訊
SELECTSID, OSUSER, USERNAME, MACHINE, PROCESS</p><p>FROMV$SESSIONWHEREaudsid = userenv('SESSIONID');</p><p>
2.當machine已知的情況下尋找session
SELECTSID, OSUSER, USERNAME, MACHINE, TERMINAL</p><p>FROMV$SESSION</p><p>WHEREterminal ='pts/tl'ANDmachine ='rgmdbs1';</p><p>
3.尋找當前被某個指定session正在啟動並執行sql語句。假設sessionID為100
selectb.sql_text</p><p>fromv$session a,v$sqlarea b</p><p>wherea.sql_hash_value=b.hash_valueanda.sid=100</p><p>
尋找被指定session執行的SQL語句是一個公用需求,如果session是瓶頸的主要原因,那根據其當前在執行的語句可以查看session在做些什麼。
視圖應用:
V$session 表的妙用v$session 表中比較常用的幾個欄位說明:
1. sid,serial#
通過sid我們可以查詢與這個session相關的各種統計資訊,處理資訊.
select * from v$sesstat where sid = :sid;<br /> 查詢使用者相關的各種統計資訊.
SELECT a.sid, a.statistic#, b.name, a.value<br /> FROM v$sesstat a, v$statname b<br /> WHERE a.statistic# = b.statistic#<br /> AND a.sid = :sid;
b. 查詢使用者相關的各種io統計資訊 select * from v$sess_io where sid = :sid;</p><p>
c. 查詢使用者想在正在開啟著的遊標變數. select * from v$open_cursor where sid = :sid;<br />
d. 查詢使用者當前的等待資訊. 以查看當前的語句為什麼這麼慢/在等待什麼資源.
select * from v$session_wait where sid = :sid ;<br />
e. 查詢使用者在一段時間內所等待的各種事件的資訊. 以瞭解這個session所遇到的瓶頸
select * from v$session_event where sid = :sid;<br />
f. 還有, 就是當我們想kill當前session的時候可以通過sid,serial#來處理.
alter system kill session ':sid,:serail#';<br />
2. paddr.欄位, process addr, 通過這個欄位我們可以查看當前進程的相關資訊, 系統進程id,作業系統使用者資訊等等.
SELECT a.pid,<br /> a.spid,<br /> b.name,<br /> b.description,<br /> a.latchwait,<br /> a.latchspin,<br /> a.pga_used_mem,<br /> a.pga_alloc_mem,<br /> a.pga_freeable_mem,<br /> a.pga_max_mem<br /> FROM v$process a, v$bgprocess b<br /> WHERE a.addr = b.paddr(+)<br /> AND a.addr = :paddr
3. command 欄位, 表明當前session正在執行的語句的類型.請參考reference.
4. taddr 當前事務的地址,可以通過這個欄位查看當前session正在執行的事務資訊, 使用的復原段資訊等
SELECT b.name rollname, a.*<br /> FROM v$transaction a, v$rollname b<br /> WHERE a.xidusn = b.usn<br /> AND a.addr = '585EC18C';<br />
5. lockwait欄位, 可以通過這個欄位查詢出當前正在等待的鎖的相關資訊.
SELECT *<br /> FROM v$lock<br /> WHERE (id1, id2) = (SELECT id1, id2 FROM v$lock WHERE kaddr = '57C68C48')<br />
6. (sql_address,sql_hash_value) (prev_sql_addr,prev_hash_value) 根據這兩組欄位, 我們可以查詢到當前session正在執行的sql語句的詳細資料.
SELECT *<br /> FROM v$sqltext<br /> WHERE address = :sql_address<br /> AND hash_value = :sql_hash_value;<br />
7.ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#
可以通過這幾個欄位查詢現在正在被鎖的表的相關資訊.^_^
a. 首先得到被鎖的的資訊 SELECT * FROM dba_objects WHERE object_id = :row_wait_obj#;<br />
b. 根據row_wait_file#可以找出對應的檔案的資訊.
SELECT * FROM v$datafile WHERE file# = :row_wait_file#.<br />
c. 在根據以上四個欄位構造出被鎖的欄位的rowid資訊.
SELECT dbms_rowid.ROWID_CREATE(1,<br /> :row_wait_obj#,<br /> :row_wait_file#,<br /> :row_wait_block#,<br /> :row_wait_row#)<br /> FROM dual;<br />
8. logon_time 當前session的登入時間.
9. last_call_et 該session idle的時間, 每3秒中更新一次.