Oracle 動態性能表 v$session & v$process各個字段的說明

v$session描述的對象是一個會話

v$session描述的對象是一個當前存在的會話(該會話不是包括當前連接到數據庫的會話,這只是數據庫前臺服務器進程的會話,還有數據庫後臺進程的會話,它是沒有連接的)。

下面對v$session裏的字段進行分組說明:


用於標識確定唯一的一個會話:SID:SERIAL#或是SADDR

SADDR: session address

 或是

SID: session identifier,常用於連接其它列。

 

SERIAL#: sid 會重用,但是同一個sid被重用時,serial#會增加,不會重複。

 註釋:

AUDSID: audit session id。

可以通過audsid查詢當前session的sid。select sid from v$session where audsid=userenv('sessionid');

所以,SIDAUDSID兩者值是一一對應的。

 AUDSID用途不一樣跟SID



一個會話的與自身相關的屬性:

COMMAND: session正在執行的SQL Id。1代表create table,3代表select。

 

TADDR: 當前的transaction address。可以用來關聯v$transaction的addr字段。



STATUS: 用來判斷session狀態。Active:正執行SQL語句。Inactive:等待操作。Killed:被標註爲刪除。

 

SERVER: server type (dedicated or shared)

Server type:

  • DEDICATED

  • SHARED

  • PSEUDO (?)

  • POOLED (?)

  • NONE

註釋:

v$session中server字段何時爲none?




TYPE: session type (background or user)


USER#: session's user id。等於dba_users中的user_id。Oracle內部進程(即後臺進程)的user#爲0。

 

USERNAME: session's username,即表示(服務端數據庫裏的)哪個數據庫用戶(而非服務端的操作系統的用戶)在使用該會話。等於dba_users中的username。Oracle內部進程(即後臺進程)的username爲空。


 

SCHEMA#: schema user id。Oracle內部進程的schema#爲0。

 

SCHEMANAME: schema username。Oracle內部進程的schemaname爲sys。(??不是爲空?對應於username?)




一個會話的所在的進程:

PADDR: process address(Address of the process that owns the session),關聯v$process的addr字段,可以通過這個字段查處當前session對應操作系統的那個進程的id。

 



 TYPE字段爲background時,PROGRAM爲服務端數據庫裏的oracle後臺進程TYPE字段爲user時,PROGRAM爲客戶端(用於連接到服務端數據庫的)應用程序(,例如,sqlplus.exe)。而以下除了PROGRAM外的字段都是用於描述PROGRAM的相關屬性的:

 

PROGRAM: 客戶端應用程序的程序名。這裏說明一點,我們通過客戶端連接到遠程的服務端後,再在比如客戶端的sqlplus窗口上使用v$session來查看的話,則v$session視圖中PROGRAM字段裏的值爲比如ORACLE.EXE (PMON)這樣子的是表示服務端的實例的後臺進程們,那麼此時v$session視圖中PROCESS字段裏的值表示爲這些服務端的進程在服務端操作系統裏的操作系統級別的進程ID號;而當v$session視圖中PROGRAM字段裏的值爲比如sqlplus.exe或是sqldeveloperw.exe這樣子的時纔是表示這些進程是來自客戶端的進程(即一個應用程序(靜)的複製來運行(動))的程序名,那麼此時v$session視圖中PROCESS字段裏的值才表示爲這些來自客戶端的進程在客戶端操作系統裏的操作系統級別的進程ID號;

總之,TYPE字段爲background時,PROGRAM爲服務端的oracle後臺進程TYPE字段爲user時,PROGRAM爲客戶端的用戶進程

 

OSUSER: 客戶端操作系統用戶名。

 

PROCESS: 客戶端應用程序在其操作系統級別上的process id。

 

MACHINE: 客戶端machine name。(表示ip地址?) 即一般是客戶端所在主機的主機名?

 

TERMINAL: 客戶端執行的terminal name。即一般是客戶端所在主機的主機名。與MACHINE區別,不清楚。????

                    附加:

                    當MACHINE=計算機名時,TERMINAL=unkown;MACHINE=工作組/計算機名時,TERMINAL=計算機名


註釋:

類似ORACLE.EXE (PMON)這些實例的後臺進程是沒有和客戶端存在連接的。

如果v$session視圖中PROGRAM字段裏的值所表示的一個進程是來自服務端的,則v$session視圖中:

OSUSER: 服務端操作系統用戶名。

 

PROCESS: 服務端在操作系統級別上的process id。

 

MACHINE: 服務端machine name。

 

TERMINAL: 服務端執行的terminal name。表示服務端所在主機的主機名。

以上幾個字段表示的是服務端的操作系統上的意義。

如果v$session視圖中PROGRAM字段裏的值所表示的一個進程是來自客戶端的,則以上幾個字段表示的是客戶端的操作系統上的意義。


 


在會話中執行的SQL語句的相關信息:

COMMAND: session正在執行的SQL Id。1代表create table,3代表select。


SQL_ADDRESS, SQL_HASH_VALUE, SQL_ID, SQL_CHILD_NUMBER: session正在執行的sql statement,和v$sql中的address, hash_value, sql_id, child_number相對應。

 

PREV_SQL_ADDR, PREV_HASH_VALUE, PREV_SQL_ID, PREV_CHILD_NUMBER: 上一次執行的sql statement。

 


用於SQL語句跟蹤的會話屬性:

MODULE, MODULE_HASH, ACTION, ACTION_HASH, CLIENT_INFO: 應用通過DBMS_APPLICATION_INFO設置的一些信息。



 

FIXED_TABLE_SEQUENCE: 當session完成一個user call後就會增加的一個數值,也就是說,如果session inactive,它就不會增加。因此可以根據此字段的值變化來監控某個時間點以來的session的性能情況。例如,一個小時以前,某個session的FIXED_TABLE_SEQUENCE是10000,而現在是20000,則表明一個小時內其user call比較頻繁,可以重點關注此session的performance statistics。

 


 LOCKWAIT: 可以通過這個字段查詢出當前正在等待的鎖的相關信息。sid & lockwait與v$lock中的sid & kaddr相對應。

ROW_WAIT_OBJ#: 被鎖定行所在table的object_id。和dba_objects中的object_id關聯可以得到被鎖定的table name。

 

ROW_WAIT_FILE#: 被鎖定行所在的datafile id。和v$datafile中的file#關聯可以得到datafile name。

 

ROW_WAIT_BLOCK#: Identifier for the block containing the row specified in ROW_WAIT_ROW#

 

ROW_WAIT_ROW#: session當前正在等待的被鎖定的行。



 

LOGON_TIME: session logon time


說明:

1、V$SESSION中AUDSID字段的產生原理及含義


Oracle的V$SESSION視圖中有一列AUDSID,一直不知其含義,在MetaLink上看到一篇文章How Sessions get Their AUDSID Identifier [ID 122230.1],詳細講述了AUDSID的產生原理和含義,大致內容總結如下:

  1. AUDSID由SYS.AUDSES$這個SEQUENCE產生,當有一個新的會話產生,其AUDSID的值即爲這個SEQUENCE的NEXTVAL。
  2. Oracle 10g之前,在會話爲’CONNECT INTERNAL’ 或爲oracle進程是Oracle後臺進程這兩種情況的時候,AUDSID的值爲0。’CONNECT INTERNAL’即指以AS SYSDBA和AS SYSOPER連接的會話。
  3. 10g及之後,AUDSID在’CONNECT INTERNAL’ 時爲UB4MAX(4294967295), 在Oracle後臺進程連接時爲0。具體如下:

If AUDSID=0, then就是 Oracle後臺進程產生的一個會話。

If AUDSID=4294967295, then說明是sys用戶產生的一個會話。

If 0<AUDSID<4294967295,then說明是普通用戶產生的一個會話。


注:UB4=UNSIGNED INT,取值範圍爲0-(2^32-1=4294967295)

由此可以看出,AUDSID與V$SESSION視圖中的SID不同的是,AUDSID主要是用於區分Oracle中的一般用戶連接Internal/後臺連接這兩類的。所以對於唯一的確定一個應用用戶(即一般用戶)會話來說,除了使用SID和SERIAL的組合,還可以使用AUDSID,來進行區別。

註釋:

AUDSID由SYS.AUDSES$這個SEQUENCE(即序列,這種數據庫對象)產生, 由desc  SYS.AUDSES$提示證明他是個SEQUENCE(即序列,這種數據庫對象)。



2、看到一個會話,我們首先要區分該會話的類型是什麼,即查看v$session視圖時首先要看TYPE字段,因爲v$session視圖中字段PROGRAMPROCESS、OSUSER、MACHINE、TERMINALTYPE字段爲不同值時有不同意義:

TYPE字段爲background時,以上幾個字段表示的是服務端的操作系統上的意義;

TYPE字段user,以上幾個字段表示的是客戶端的操作系統上的意義。





3、select    type,program from v$sessionwheretype =‘background’;或是select    audsid,program from v$session whereaudsid=0;所得結果例如:

SQL>select    type,program from v$session where type =‘background’;

type                    program

-------                   -------------

background      oracle.exe(LGWR)

或者

SQL>select   audsid,program from v$session where audsid=0;

audsid                    program

-------                       -------------

0                             oracle.exe(LGWR)


由上述語句有結果,可以說明一個後臺進程產生是,至少會(伴隨)自動啓動一個屬於自己的會話。


4V$SESSION中 process字段的值爲XX:XX形式時的解釋

      舉一個更直觀的例子,我在windows操作系統的主機上用sqlplus去遠程連接到AIX服務器上的oracle數據庫系統。
     假設我們現在已知的條件爲:sid=424,paddr=070000012A6DC150。

那麼,

SQL> select spid from v$process where addr='070000012A6DC150';

SPID
------------
1318950
這裏的1318950就是AIX(server端)上fork出來的進程號。


/home/guest/dxhibm>ps -ef | grep 1318950
  oracle 1318950       1   0 10:00:05      -  0:00 oracleora92 (LOCAL=NO)
  dxhibm 3711144 1138788   0 10:02:48  pts/1  0:00 grep 1318950

SQL> select process from v$session where sid=424 ;

PROCESS
------------
2856:3260

這個就是在windows(client端)對應的sqlplus這個進程的進程號和線程號。


明白了,WINDWOW和PLSQL DEVELOPE等有線程的概念,所以把線程寫出來,如果是UNIX下,沒有線程的概念,就沒有這個XX:XX的東東了


註釋:

實驗環境還是,我在一個windows操作系統的主機上,用sqlplus去遠程連接到AIX服務器上的oracle數據庫系統。接着,我在sqlplus窗口上,執行 select s.type,s.process,p.spid from v$session s,v$process p where s.paddr=p.addr;語句,結果發現:

type爲background時,s.process值和p.spid值相同,因爲此時兩者都是表示同一個進程(即位於服務端的oracle後臺進程)的進程號;

p.spidp.spidp.spidp.spid

type爲user時,s.process值和p.spid值不一樣,因爲此時前者表示用戶進程(位於客戶端)的進程號,後者依然表示同一個進程(位於服務端)的進程號表示同一個進程(位於服務端)的進程號表示服務器進程(也即oracle前臺進程,位於服務端)的進程號

參考:http://www.itpub.NET/thread-736652-2-1.html


5、type爲background時,字段OSUSER一般爲SYSTEM(位於服務端的操作系統的操作系統用戶)。由此看出,在window下,oracle實例的後臺進程,都是在該用戶下運行的,而不是我們登陸該window操作系統的用戶。

關於window下的SYSTEM用戶,參考:

《WINDOWS下system用戶至高無上的權限》



====================================================================================================================================

 

v$process


前言:v$process所查看的進程都是服務端裏(oracle系統)的進程。


 

ADDR: process address。可以和v$session的paddr字段關聯。

 


PID: Oracle進程identifier,即表示該進程在其所在的oracle數據庫系統裏的進程ID號。

 SERIAL#:: process serial number。類似於v$session中的SERIAL#是配合SID的一樣,這裏的SERIAL#配合PID的SERIAL#不是一個獨立字段,即pid 會重用,但是同一個pid被重用時,serial#會增加,不會重複。



SPID: 操作系統進程identifier,即表示該進程在其所在的操作系統裏的進程ID號。



 


 

PROGRAM: 進程正在執行的程序(e.g., ORACLE.EXE (ARC0)),和v$session中的program類似。它表示的是該進程在操作系統中的名稱。

PNAME: 它表示的是該進程在oracle數據庫系統中的名稱。

 

BACKGROUND: 1代表oracle background process,null代表normal process。




TERMINAL: 操作系統terminal identifier(e.g., computer name)。表示該進程所在操作系統的主機名。

 

USERNAME: 操作系統進程的用戶名。並非Oracle用戶名。它表示的是該進程所在的屬於操作系統的用戶名。如,在window操作系統下,PROGRAM爲 ORACLE.EXE (LGWR)的進程,是屬於操作系統用戶system的。



註釋:v$process中的username字段和v$session中的osuser字段一樣表示操作系統的用戶,而v$session中的username字段表示oracle系統的用戶。

=====================================================================================================

附加:

1、v$process
這個視圖提供的信息,都是oracle服務進程的信息,沒有客戶端程序相關的信息
服務進程分兩類,一是後臺的,一是dedicate/shared server
pid, serial#     這是oracle分配的PID
spid             這纔是操作系統的pid
program          這是服務進程對應的操作系統進程名

v$session:
這個視圖主要提供的是一個數據庫connect的信息,
主要是client端的信息,比如以下字段:
machine   在哪臺機器上
terminal  使用什麼終端
osuser    操作系統用戶是誰
program   通過什麼客戶端程序,比如TOAD
process   操作系統分配給TOAD的進程號
logon_time  在什麼時間
username    以什麼oracle的帳號登錄
command     執行了什麼類型的SQL命令
sql_hash_value  SQL語句信息

有一些是server端的信息:
paddr   即v$process中的server進程的addr
server  服務器是dedicate/shared

還有其它一些信息,可以理解爲是client/server共享的信息,主要是針對這個session而言的

2、

至於sid和audsid的區別,自己也沒太搞明白,網上摘了一段:

  --from asktom

  the audsid column is populated via a sequence and for normal

  sessions is the same as "userenv('sessionid')" -- but for some background sessions -- it is not set

  (it comes back as "0" making the view not work.

  So, I'd just ignore "audsid" for now and use SID.

3、

關於Oracle10g裏v$session.audsid字段的解釋

In 10g we make a further distinction for SYS sessions: 

If AUDSID=0, then it is an internally generated SYS session. 

If AUDSID=UB4MAX(4294967295), then it is a direct SYS session. 比如Dataguard裏備庫的連接進程.

refer: How Sessions get Their AUDSID Identifier [ID 122230.1]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章