1. 程式人生 > >Oracle 動態效能表 v$session & v$process各個欄位的說明

Oracle 動態效能表 v$session & v$process各個欄位的說明

v$session

 參照:


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

註釋:

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時,