【Oracle】詳解v$session
首先查看一下v$session都存在哪些列
SYS@ORCL>desc v$session
Name Null? Type
----------------------------------------- -------- ----------------------------
SADDR RAW(4)
SID NUMBER
SERIAL# NUMBER
AUDSID NUMBER
PADDR RAW(4)
USER# NUMBER
USERNAME 2 VARCHAR2(30)
COMMAND NUMBER
OWNERID NUMBER
TADDR VARCHAR2(8)
LOCKWAIT VARCHAR2(8)
STATUS VARCHAR2(8)
SERVER VARCHAR2(9)
SCHEMA# NUMBER
SCHEMANAME VARCHAR2(30)
OSUSER VARCHAR2(30)
PROCESS VARCHAR2(12)
MACHINE VARCHAR2(64)
TERMINAL VARCHAR2(30)
PROGRAM VARCHAR2(48)
TYPE VARCHAR2(10)
SQL_ADDRESS RAW(4)
SQL_HASH_VALUE NUMBER
SQL_ID VARCHAR2(13)
SQL_CHILD_NUMBER NUMBER
PREV_SQL_ADDR RAW(4)
PREV_HASH_VALUE NUMBER
PREV_SQL_ID VARCHAR2(13)
PREV_CHILD_NUMBER NUMBER
MODULE VARCHAR2(48)
MODULE_HASH NUMBER
ACTION VARCHAR2(32)
ACTION_HASH NUMBER
CLIENT_INFO VARCHAR2(64)
FIXED_TABLE_SEQUENCE NUMBER
ROW_WAIT_OBJ# NUMBER
ROW_WAIT_FILE# NUMBER
ROW_WAIT_BLOCK# NUMBER
ROW_WAIT_ROW# NUMBER
LOGON_TIME DATE
LAST_CALL_ET NUMBER
PDML_ENABLED VARCHAR2(3)
FAILOVER_TYPE VARCHAR2(13)
FAILOVER_METHOD VARCHAR2(10)
FAILED_OVER VARCHAR2(3)
RESOURCE_CONSUMER_GROUP VARCHAR2(32)
PDML_STATUS VARCHAR2(8)
PDDL_STATUS VARCHAR2(8)
PQ_STATUS VARCHAR2(8)
CURRENT_QUEUE_DURATION NUMBER
CLIENT_IDENTIFIER VARCHAR2(64)
BLOCKING_SESSION_STATUS VARCHAR2(11)
BLOCKING_INSTANCE NUMBER
BLOCKING_SESSION NUMBER
SEQ# NUMBER
EVENT# NUMBER
EVENT VARCHAR2(64)
P1TEXT VARCHAR2(64)
P1 NUMBER
P1RAW RAW(4)
P2TEXT VARCHAR2(64)
P2 NUMBER
P2RAW RAW(4)
P3TEXT VARCHAR2(64)
P3 NUMBER
P3RAW RAW(4)
WAIT_CLASS_ID NUMBER
WAIT_CLASS# NUMBER
WAIT_CLASS VARCHAR2(64)
WAIT_TIME NUMBER
SECONDS_IN_WAIT NUMBER
STATE VARCHAR2(19)
SERVICE_NAME VARCHAR2(64)
SQL_TRACE VARCHAR2(8)
SQL_TRACE_WAITS VARCHAR2(5)
SQL_TRACE_BINDS VARCHAR2(5)
SADDR-——當前會話在內存中的地址
SAD——當前會話的id號
SERIAL# ——會話的串號,當一個會話結束後,另外的會話可能會重用該會話的id號,此時就需要SERIAL#來確定唯一的會話對象。也就是說SID+SERIAL#來確定唯一的會話。
AUDSID——該會話對應的審計會話的id號
PADDR——會話對應的進程地址,關聯v$process視圖的addr字段可以找到會話對應的操作系統進程。
USER#——會話對應用戶的id號,對應dba_users的user_id字段
USERNAME——會話對應用戶的USERNAME
COMMAND——正在執行的當前命令類型,記錄的是一個數值,要結合下表進行查看
Table 7-5 COMMAND Column of V$SESSION and Corresponding Commands
Number |
Command |
Number |
Command |
1 |
CREATE TABLE |
2 |
INSERT |
3 |
SELECT |
4 |
CREATE CLUSTER |
5 |
ALTER CLUSTER |
6 |
UPDATE |
7 |
DELETE |
8 |
DROP CLUSTER |
9 |
CREATE INDEX |
10 |
DROP INDEX |
11 |
ALTER INDEX |
12 |
DROP TABLE |
13 |
CREATE SEQUENCE |
14 |
ALTER SEQUENCE |
15 |
ALTER TABLE |
16 |
DROP SEQUENCE |
17 |
GRANT OBJECT |
18 |
REVOKE OBJECT |
19 |
CREATE SYNONYM |
20 |
DROP SYNONYM |
21 |
CREATE VIEW |
22 |
DROP VIEW |
23 |
VALIDATE INDEX |
24 |
CREATE PROCEDURE |
25 |
ALTER PROCEDURE |
26 |
LOCK |
27 |
NO-OP |
28 |
RENAME |
29 |
COMMENT |
30 |
AUDIT OBJECT |
31 |
NOAUDIT OBJECT |
32 |
CREATE DATABASE LINK |
33 |
DROP DATABASE LINK |
34 |
CREATE DATABASE |
35 |
ALTER DATABASE |
36 |
CREATE ROLLBACK SEG |
37 |
ALTER ROLLBACK SEG |
38 |
DROP ROLLBACK SEG |
39 |
CREATE TABLESPACE |
40 |
ALTER TABLESPACE |
41 |
DROP TABLESPACE |
42 |
ALTER SESSION |
43 |
ALTER USER |
44 |
COMMIT |
45 |
ROLLBACK |
46 |
SAVEPOINT |
47 |
PL/SQL EXECUTE |
48 |
SET TRANSACTION |
49 |
ALTER SYSTEM |
50 |
EXPLAIN |
51 |
CREATE USER |
52 |
CREATE ROLE |
53 |
DROP USER |
54 |
DROP ROLE |
55 |
SET ROLE |
56 |
CREATE SCHEMA |
57 |
CREATE CONTROL FILE |
59 |
CREATE TRIGGER |
60 |
ALTER TRIGGER |
61 |
DROP TRIGGER |
62 |
ANALYZE TABLE |
63 |
ANALYZE INDEX |
64 |
ANALYZE CLUSTER |
65 |
CREATE PROFILE |
66 |
DROP PROFILE |
67 |
ALTER PROFILE |
68 |
DROP PROCEDURE |
70 |
ALTER RESOURCE COST |
71 |
CREATE MATERIALIZED VIEW LOG |
72 |
ALTER MATERIALIZED VIEW LOG |
73 |
DROP MATERIALIZED VIEW LOG |
74 |
CREATE MATERIALIZED VIEW |
75 |
ALTER MATERIALIZED VIEW |
76 |
DROP MATERIALIZED VIEW |
77 |
CREATE TYPE |
78 |
DROP TYPE |
79 |
ALTER ROLE |
80 |
ALTER TYPE |
81 |
CREATE TYPE BODY |
82 |
ALTER TYPE BODY |
83 |
DROP TYPE BODY |
84 |
DROP LIBRARY |
85 |
TRUNCATE TABLE |
86 |
TRUNCATE CLUSTER |
91 |
CREATE FUNCTION |
92 |
ALTER FUNCTION |
93 |
DROP FUNCTION |
94 |
CREATE PACKAGE |
95 |
ALTER PACKAGE |
96 |
DROP PACKAGE |
97 |
CREATE PACKAGE BODY |
98 |
ALTER PACKAGE BODY |
99 |
DROP PACKAGE BODY |
100 |
LOGON |
101 |
LOGOFF |
102 |
LOGOFF BY CLEANUP |
103 |
SESSION REC |
104 |
SYSTEM AUDIT |
105 |
SYSTEM NOAUDIT |
106 |
AUDIT DEFAULT |
107 |
NOAUDIT DEFAULT |
108 |
SYSTEM GRANT |
109 |
SYSTEM REVOKE |
110 |
CREATE PUBLIC SYNONYM |
111 |
DROP PUBLIC SYNONYM |
112 |
CREATE PUBLIC DATABASE LINK |
113 |
DROP PUBLIC DATABASE LINK |
114 |
GRANT ROLE |
115 |
REVOKE ROLE |
116 |
EXECUTE PROCEDURE |
117 |
USER COMMENT |
118 |
ENABLE TRIGGER |
119 |
DISABLE TRIGGER |
120 |
ENABLE ALL TRIGGERS |
121 |
DISABLE ALL TRIGGERS |
122 |
NETWORK ERROR |
123 |
EXECUTE TYPE |
157 |
CREATE DIRECTORY |
158 |
DROP DIRECTORY |
159 |
CREATE LIBRARY |
160 |
CREATE JAVA |
161 |
ALTER JAVA |
162 |
DROP JAVA |
163 |
CREATE OPERATOR |
164 |
CREATE INDEXTYPE |
165 |
DROP INDEXTYPE |
167 |
DROP OPERATOR |
168 |
ASSOCIATE STATISTICS |
169 |
DISASSOCIATE STATISTICS |
170 |
CALL METHOD |
171 |
CREATE SUMMARY |
172 |
ALTER SUMMARY |
173 |
DROP SUMMARY |
174 |
CREATE DIMENSION |
175 |
ALTER DIMENSION |
176 |
DROP DIMENSION |
177 |
CREATE CONTEXT |
178 |
DROP CONTEXT |
179 |
ALTER OUTLINE |
180 |
CREATE OUTLINE |
181 |
DROP OUTLINE |
182 |
UPDATE INDEXES |
183 |
ALTER OPERATOR |
|
|
OWNERID——如果值為2147483644,則此列的內容無效。否則此列包含擁有可移植會話的用戶標符。對於利用並行從服務器的操作,將這個值解釋為一個48 字節的值。其低位兩字節表示會話號,而高位字節表示查詢協調程序的實例ID。
TADDR——當前有活動事務的地址,關聯v$transaction視圖的addr可以查出當前session正在使用的回滾段的信息以及當前事務大小等情況。
LOCKWAIT——當前會話正在等待的鎖的地址,如果沒有等待鎖則為null。
STATUS——當前會話的狀態
l ACTIVE:正在執行SQL語句
l INACTIVE:會話不是活動狀態,正在等待要執行的SQL語句。
l KILLED:被標記為已經殺死
l CACHED:會話被oracle *XA緩存起來使用。不是太懂,兩端提交?。。
l SNIPED :會話在等待client端的響應。
SERVER——數據庫提供服務的方式
l Dedicated:專用服務器模式
l Shared:共享服務器模式
SECHEMA#——模式用戶標識符
SECHEMANAME——模式用戶名
OSUSER——會話的客戶端系統的用戶名
PROCESS——會話客戶端進程id號
附:
關於v$process與v$session中process的理解
說明
v$session有個process字段,V$PROCESS有個SPID字段,這兩個字段是不是一個意思呢?是不是都代表會話的操作系統進程呢?
官方文檔上的解釋:
SPID VARCHAR2(12) Operating system process identifier
PROCESS VARCHAR2(9) Operating system client process ID
本文以數據庫服務器安裝在linux上為例進行說明。
V$PROCESS中的SPID表示的是操作系統的進程,v$session中的process表示客戶端進程ID,即客戶端進程在客戶端機器上的進程ID號。一個表示客戶端進程在客戶端機器上的進程號,一個表示服務器進程在服務器上的進程號。
連接服務器的會話,發起會話的客戶端進程可能是unix進程,也可能是windows進程。
MACHINE——操作系統機器名
TERMINAL——操作系統系統終端名稱
可以根據主terminal查詢客戶端的ip
select utl_inaddr.get_host_address(terminal) from v$session where username is not null;
PROGRAM——操作系統通過什麽程序連接oracle。通過本機連接的session,一般都有program。如果是通過服務器連接的session,一般都沒有program。
TYPE——會話的類型。是用戶創建的還是後臺進程創建的。
SQL_ADDRESS和SQL_HASH_VALUE——一起來確定正在執行的SQL語句。關聯v$sql,v$sqltext,v$sqlarea。
SQL_ID——正在執行的SQL語句的id
SQL_CHILD_MUMBER——正在執行的SQL語句的子句。
PREV_......前一句執行的SQL語句的信息。
MODULE——用戶通過DBMS_APPLICATION_INFO.SET_MODULE進行的一些設置的名字
MODULE_HASH——MODULE的hash值
ACTION——用戶通過DBMS_APPLICATION_INFO.SET_ACTION進行的一些設置的名字
ACTION_HASH——ACTION的HASH值
CLIENT_INFO——用戶通過DBMS_APPLICATION_INFO.SET_CLIENT_INFO進行一些設置的相關信息。
FIXD_TABLE_SEQUENCE——當session完成一個user call後就會增加的一個數值,也就是說,如果session掛起,它就不會增加。因此可以根據這個字段來監控某個時間點以來的session性能情況。例如,一個小時前某個session的此字段數值為10000,而現在是20000,則表明一個小時內其user call較頻繁,可以重點關註此session的performance statistics。
ROW_WAIT_OBJ#——被鎖定行所在table的object_id。和dba_objects中的object_id關聯可以得到被鎖定的table name。
ROW_WAIT_FILE#——被鎖定行所在的datafile id。和v$datafile中的file#關聯可以得到datafile name。
ROW_WAIT_ROW#——session當前正在等待的被鎖定的行。
LOGON_TIME——會話登錄的時間
LAST_CALL_ET——如果會話是ACTIVE狀態則表示了會話已經持續ACTIVE狀態多久。如果會話是INACTIVE狀態則表示會話已經處於INACTIVE狀態多久。
PDML_ENABLED——這列已經被PDML_STATUS列取代,那麽PDML_STATUS列代表了什麽。如果是ENABLED則代表了這個會話執行DML語句可以使用oracle的並行執行技術,如果是DISABLE則代表了這個會話執行DDL語句禁止使用oracle並行執行技術。
PDDL_STATUS——和PDML_STATUS差不多,只不過這個是針對DDL語句的。
PQ_STATUS——也和以上兩條差不多,只不過這個是針對select語句的。Q代表query。
CURRENT_QUEUE_DURATION——如果值為1則代表session已經在隊列中,如果是0則代表還沒有形成排隊。
CLIENT_IDENTIFIER——客戶端會話的標識符。
BLOCKING_SESSION_STATUS
VALID 狀態valid為正在等待
NO HOLDER
GLOBAL
NOT IN WAIT
UNKNOWN
發生阻塞時候可以查詢
到了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
BLOCKING_INSTANCE——模塊化的實例標識符
BLOCKING_SESSION——模塊化的session標識符
SEQ#——不唯一的標示每個等待的序列號
EVENT#——事件數量
EVENT——oracle的session正在等待的數據或者事件
P1TEXT——首個附加參數的描述
P1——首個附加參數
P1RAW——首個附加參數和前一個區別我還不是很懂
P2TEXT——第二個附加參數的描述
P2——第二個附加參數
P2RAW——第二個附加參數
P3TEXT——第三個附加參數的描述
P3——第三個附加參數
P3RAW——第三個附加參數
WAIT_CLASS_ID——標記等待事件種類
WAIT_CLASS#——等待事件的種類
WAIT_CLASS——等待事件的名稱
WAIT_TIME——非0代表上一次session上次等待時間,0代表session當前正在等待
SECONDS_IN_WAIT——等待的時間
oracle文檔的資料:
If WAIT_TIME = 0, then SECONDS_IN_WAIT is the seconds spent in the
current wait condition. If WAIT_TIME > 0, then SECONDS_IN_WAIT is the
seconds since the start of the last wait, and SECONDS_IN_WAIT - WAIT_
TIME / 100 is the active seconds since the last wait ended.
STATE
0 - WAITING (the session is currently waiting)
-2 - WAITED UNKNOWN TIME (duration of last wait is unknown)
-1 - WAITED SHORT TIME (last wait <1/100th of a second)
>0 - WAITED KNOWN TIME (WAIT_TIME = duration of last wait)
SERVICE_NAME——session的服務名稱
SQL_TRACE——標示sql是否能被跟蹤
SQL_TRACE_WAITS——標記是否等待事件被跟蹤
SQL_TRACE_BINDS——標記是否綁定跟蹤可用與否
【Oracle】詳解v$session