首先查看一下v$session都存在哪些列
SYS@ORCL>descv$session
NameNull?Type
-----------------------------------------------------------------------------
SADDRRAW(4)
SIDNUMBER
SERIAL#NUMBER
AUDSIDNUMBER
PADDRRAW(4)
USER#NUMBER
USERNAME2VARCHAR2(30)
COMMANDNUMBER
OWNERIDNUMBER
TADDRVARCHAR2(8)
LOCKWAITVARCHAR2(8)
STATUSVARCHAR2(8)
SERVERVARCHAR2(9)
SCHEMA#NUMBER
SCHEMANAMEVARCHAR2(30)
OSUSERVARCHAR2(30)
PROCESSVARCHAR2(12)
MACHINEVARCHAR2(64)
TERMINALVARCHAR2(30)
PROGRAMVARCHAR2(48)
TYPEVARCHAR2(10)
SQL_ADDRESSRAW(4)
SQL_HASH_VALUENUMBER
SQL_IDVARCHAR2(13)
SQL_CHILD_NUMBERNUMBER
PREV_SQL_ADDRRAW(4)
PREV_HASH_VALUENUMBER
PREV_SQL_IDVARCHAR2(13)
PREV_CHILD_NUMBERNUMBER
MODULEVARCHAR2(48)
MODULE_HASHNUMBER
ACTIONVARCHAR2(32)
ACTION_HASHNUMBER
CLIENT_INFOVARCHAR2(64)
FIXED_TABLE_SEQUENCENUMBER
ROW_WAIT_OBJ#NUMBER
ROW_WAIT_FILE#NUMBER
ROW_WAIT_BLOCK#NUMBER
ROW_WAIT_ROW#NUMBER
LOGON_TIMEDATE
LAST_CALL_ETNUMBER
PDML_ENABLEDVARCHAR2(3)
FAILOVER_TYPEVARCHAR2(13)
FAILOVER_METHODVARCHAR2(10)
FAILED_OVERVARCHAR2(3)
RESOURCE_CONSUMER_GROUPVARCHAR2(32)
PDML_STATUSVARCHAR2(8)
PDDL_STATUSVARCHAR2(8)
PQ_STATUSVARCHAR2(8)
CURRENT_QUEUE_DURATIONNUMBER
CLIENT_IDENTIFIERVARCHAR2(64)
BLOCKING_SESSION_STATUSVARCHAR2(11)
BLOCKING_INSTANCENUMBER
BLOCKING_SESSIONNUMBER
SEQ#NUMBER
EVENT#NUMBER
EVENTVARCHAR2(64)
P1TEXTVARCHAR2(64)
P1NUMBER
P1RAWRAW(4)
P2TEXTVARCHAR2(64)
P2NUMBER
P2RAWRAW(4)
P3TEXTVARCHAR2(64)
P3NUMBER
P3RAWRAW(4)
WAIT_CLASS_IDNUMBER
WAIT_CLASS#NUMBER
WAIT_CLASSVARCHAR2(64)
WAIT_TIMENUMBER
SECONDS_IN_WAITNUMBER
STATEVARCHAR2(19)
SERVICE_NAMEVARCHAR2(64)
SQL_TRACEVARCHAR2(8)
SQL_TRACE_WAITSVARCHAR2(5)
SQL_TRACE_BINDSVARCHAR2(5)
SADDR-——当前会话在内存中的地址
SAD——当前会话的id号
SERIAL#——会话的串号,当一个会话结束后,另外的会话可能会重用该会话的id号,此时就需要SERIAL#来确定唯一的会话对象。也就是说SID+SERIAL#来确定唯一的会话。
AUDSID——该会话对应的审计会话的id号
PADDR——会话对应的进程地址,关联v$process视图的addr字段可以找到会话对应的操作系统进程。
USER#——会话对应用户的id号,对应dba_users的user_id字段
USERNAME——会话对应用户的USERNAME
COMMAND——正在执行的当前命令类型,记录的是一个数值,要结合下表进行查看
Table7-5COMMANDColumnofV$SESSIONandCorrespondingCommands
Number | Command | Number | Command |
1 | CREATETABLE | 2 | INSERT |
3 | SELECT | 4 | CREATECLUSTER |
5 | ALTERCLUSTER | 6 | UPDATE |
7 | DELETE | 8 | DROPCLUSTER |
9 | CREATEINDEX | 10 | DROPINDEX |
11 | ALTERINDEX | 12 | DROPTABLE |
13 | CREATESEQUENCE | 14 | ALTERSEQUENCE |
15 | ALTERTABLE | 16 | DROPSEQUENCE |
17 | GRANTOBJECT | 18 | REVOKEOBJECT |
19 | CREATESYNONYM | 20 | DROPSYNONYM |
21 | CREATEVIEW | 22 | DROPVIEW |
23 | VALIDATEINDEX | 24 | CREATEPROCEDURE |
25 | ALTERPROCEDURE | 26 | LOCK |
27 | NO-OP | 28 | RENAME |
29 | COMMENT | 30 | AUDITOBJECT |
31 | NOAUDITOBJECT | 32 | CREATEDATABASELINK |
33 | DROPDATABASELINK | 34 | CREATEDATABASE |
35 | ALTERDATABASE | 36 | CREATEROLLBACKSEG |
37 | ALTERROLLBACKSEG | 38 | DROPROLLBACKSEG |
39 | CREATETABLESPACE | 40 | ALTERTABLESPACE |
41 | DROPTABLESPACE | 42 | ALTERSESSION |
43 | ALTERUSER | 44 | COMMIT |
45 | ROLLBACK | 46 | SAVEPOINT |
47 | PL/SQLEXECUTE | 48 | SETTRANSACTION |
49 | ALTERSYSTEM | 50 | EXPLAIN |
51 | CREATEUSER | 52 | CREATEROLE |
53 | DROPUSER | 54 | DROPROLE |
55 | SETROLE | 56 | CREATESCHEMA |
57 | CREATECONTROLFILE | 59 | CREATETRIGGER |
60 | ALTERTRIGGER | 61 | DROPTRIGGER |
62 | ANALYZETABLE | 63 | ANALYZEINDEX |
64 | ANALYZECLUSTER | 65 | CREATEPROFILE |
66 | DROPPROFILE | 67 | ALTERPROFILE |
68 | DROPPROCEDURE | 70 | ALTERRESOURCECOST |
71 | CREATEMATERIALIZEDVIEWLOG | 72 | ALTERMATERIALIZEDVIEWLOG |
73 | DROPMATERIALIZEDVIEWLOG | 74 | CREATEMATERIALIZEDVIEW |
75 | ALTERMATERIALIZEDVIEW | 76 | DROPMATERIALIZEDVIEW |
77 | CREATETYPE | 78 | DROPTYPE |
79 | ALTERROLE | 80 | ALTERTYPE |
81 | CREATETYPEBODY | 82 | ALTERTYPEBODY |
83 | DROPTYPEBODY | 84 | DROPLIBRARY |
85 | TRUNCATETABLE | 86 | TRUNCATECLUSTER |
91 | CREATEFUNCTION | 92 | ALTERFUNCTION |
93 | DROPFUNCTION | 94 | CREATEPACKAGE |
95 | ALTERPACKAGE | 96 | DROPPACKAGE |
97 | CREATEPACKAGEBODY | 98 | ALTERPACKAGEBODY |
99 | DROPPACKAGEBODY | 100 | LOGON |
101 | LOGOFF | 102 | LOGOFFBYCLEANUP |
103 | SESSIONREC | 104 | SYSTEMAUDIT |
105 | SYSTEMNOAUDIT | 106 | AUDITDEFAULT |
107 | NOAUDITDEFAULT | 108 | SYSTEMGRANT |
109 | SYSTEMREVOKE | 110 | CREATEPUBLICSYNONYM |
111 | DROPPUBLICSYNONYM | 112 | CREATEPUBLICDATABASELINK |
113 | DROPPUBLICDATABASELINK | 114 | GRANTROLE |
115 | REVOKEROLE | 116 | EXECUTEPROCEDURE |
117 | USERCOMMENT | 118 | ENABLETRIGGER |
119 | DISABLETRIGGER | 120 | ENABLEALLTRIGGERS |
121 | DISABLEALLTRIGGERS | 122 | NETWORKERROR |
123 | EXECUTETYPE | 157 | CREATEDIRECTORY |
158 | DROPDIRECTORY | 159 | CREATELIBRARY |
160 | CREATEJAVA | 161 | ALTERJAVA |
162 | DROPJAVA | 163 | CREATEOPERATOR |
164 | CREATEINDEXTYPE | 165 | DROPINDEXTYPE |
167 | DROPOPERATOR | 168 | ASSOCIATESTATISTICS |
169 | DISASSOCIATESTATISTICS | 170 | CALLMETHOD |
171 | CREATESUMMARY | 172 | ALTERSUMMARY |
173 | DROPSUMMARY | 174 | CREATEDIMENSION |
175 | ALTERDIMENSION | 176 | DROPDIMENSION |
177 | CREATECONTEXT | 178 | DROPCONTEXT |
179 | ALTEROUTLINE | 180 | CREATEOUTLINE |
181 | DROPOUTLINE | 182 | UPDATEINDEXES |
183 | ALTEROPERATOR |
OWNERID——如果值为2147483644,则此列的内容无效。否则此列包含拥有可移植会话的用户标符。对于利用并行从服务器的操作,将这个值解释为一个48字节的值。其低位两字节表示会话号,而高位字节表示查询协调程序的实例ID。
TADDR——当前有活动事务的地址,关联v$transaction视图的addr可以查出当前session正在使用的回滚段的信息以及当前事务大小等情况。
LOCKWAIT——当前会话正在等待的锁的地址,如果没有等待锁则为null。
STATUS——当前会话的状态
lACTIVE:正在执行SQL语句
lINACTIVE:会话不是活动状态,正在等待要执行的SQL语句。
lKILLED:被标记为已经杀死
lCACHED:会话被oracle*XA缓存起来使用。不是太懂,两端提交?。。
lSNIPED:会话在等待client端的响应。
SERVER——数据库提供服务的方式
lDedicated:专用服务器模式
lShared:共享服务器模式
SECHEMA#——模式用户标识符
SECHEMANAME——模式用户名
OSUSER——会话的客户端系统的用户名
PROCESS——会话客户端进程id号
附:
关于v$process与v$session中process的理解
说明
v$session有个process字段,V$PROCESS有个SPID字段,这两个字段是不是一个意思呢?是不是都代表会话的操作系统进程呢?
官方文档上的解释:
SPIDVARCHAR2(12)Operatingsystemprocessidentifier
PROCESSVARCHAR2(9)OperatingsystemclientprocessID
本文以数据库服务器安装在linux上为例进行说明。
V$PROCESS中的SPID表示的是操作系统的进程,v$session中的process表示客户端进程ID,即客户端进程在客户端机器上的进程ID号。一个表示客户端进程在客户端机器上的进程号,一个表示服务器进程在服务器上的进程号。
连接服务器的会话,发起会话的客户端进程可能是unix进程,也可能是windows进程。
MACHINE——操作系统机器名
TERMINAL——操作系统系统终端名称
可以根据主terminal查询客户端的ip
selectutl_inaddr.get_host_address(terminal)fromv$sessionwhereusernameisnotnull;
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完成一个usercall后就会增加的一个数值,也就是说,如果session挂起,它就不会增加。因此可以根据这个字段来监控某个时间点以来的session性能情况。例如,一个小时前某个session的此字段数值为10000,而现在是20000,则表明一个小时内其usercall较频繁,可以重点关注此session的performancestatistics。
ROW_WAIT_OBJ#——被锁定行所在table的object_id。和dba_objects中的object_id关联可以得到被锁定的tablename。
ROW_WAIT_FILE#——被锁定行所在的datafileid。和v$datafile中的file#关联可以得到datafilename。
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为正在等待
NOHOLDER
GLOBAL
NOTINWAIT
UNKNOWN
发生阻塞时候可以查询
到了10G,多了blocking_session和blocking_session_status字段,可以知道是否被阻塞。如果blocking_session_status字段是VALID,那一个有效的SID会出现在blocking_session字段。
SQL>selectsid,sql_id,PREV_SQL_ID,BLOCKING_SESSION_STATUS,BLOCKING_SESSION,WAIT_CLASS_ID,SECONDS_IN_WAIT,WAIT_CLASSfromv$sessionwhere
2username='KONG';
SIDSQL_IDPREV_SQL_IDBLOCKING_SESSION_STATUSBLOCKING_SESSIONWAIT_CLASS_IDSECONDS_IN_WAITWAIT_CLASS
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2900hcsvq77pq2a8dyk4dprp70d74VALID3004217450380118Application
3000hcsvq77pq2a8NOHOLDER2723168908124Idle
可以看到290的进程被300的进程阻塞。
在以前如果想要查询某个session执行了那个sql语句,那需要用两个字段来查询:HASH_VALUE和ADDRESS。现在只有一个SQL_ID就可以了。
SQL>selectsql_textfromv$sqltextst,v$sessions
2where(st.sql_id=s.sql_id)ands.sid=300;
SQL_TEXT
----------------------------------------------------------------
selectcount(*)fromt2
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文档的资料:
IfWAIT_TIME=0,thenSECONDS_IN_WAITisthesecondsspentinthe
currentwaitcondition.IfWAIT_TIME>0,thenSECONDS_IN_WAITisthe
secondssincethestartofthelastwait,andSECONDS_IN_WAIT-WAIT_
TIME/100istheactivesecondssincethelastwaitended.
STATE
0-WAITING(thesessioniscurrentlywaiting)
-2-WAITEDUNKNOWNTIME(durationoflastwaitisunknown)
-1-WAITEDSHORTTIME(lastwait<1/100thofasecond)
>0-WAITEDKNOWNTIME(WAIT_TIME=durationoflastwait)
SERVICE_NAME——session的服务名称
SQL_TRACE——标示sql是否能被跟踪
SQL_TRACE_WAITS——标记是否等待事件被跟踪
SQL_TRACE_BINDS——标记是否绑定跟踪可用与否