一. v$session
每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。
- 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‘);
- PADDR: process address,关联v$process的addr字段,可以通过这个字段查处当前session对应操作系统的那个进程的id。
- USER#: session‘s user id。等于dba_users中的user_id。Oracle内部进程的user#为0。
- USERNAME: session‘s username。等于dba_users中的username。Oracle内部进程的username为空。
- COMMAND: session正在执行的sql Id。1代表create table,3代表select。
- TADDR: 当前的transaction address。可以用来关联v$transaction的addr字段。
- LOCKWAIT: 可以通过这个字段查询出当前正在等待的锁的相关信息。sid & lockwait与v$lock中的sid & kaddr相对应。
- STATUS: 用来判断session状态。Active:正执行sql语句。Inactive:等待操作。Killed:被标注为删除。
- PROCESS: 客户端process id。
- MACHINE: 客户端machine name。
- TERMINAL: 客户端执行的terminal name。
- PROGRAM: 客户端应用程序。比如ORACLE.EXE (PMON)或者sqlplus.exe
- sql_ADDRESS,sql_HASH_VALUE,sql_ID,sql_CHILD_NUMBER: session正在执行的sql statement,和v$sql中的address,hash_value,sql_id,child_number相对应。
二. v$process
- ADDR: process address。可以和v$session的paddr字段关联。
- PID: Oracle进程identifier。
-
SPID
: 操作系统进程identifier。 - PNAME:进程名字,如PMON,SMON。
- USERNAME: 操作系统进程的用户名。并非Oracle用户名。
- SERIAL#:: process serial number。
- TERMINAL: 操作系统terminal identifier(e.g.,computer name)。
- PROGRAM: 进程正在执行的程序(e.g.,ORACLE.EXE (ARC0)),和v$session中的program类似。
- TRACEFILE: trace文件路径。
BACKGROUND: 1代表oracle background process,null代表normal process。
三. 常用脚本
--windows 下kill会话
cmd>orakill 实例 spid
--查看阻塞
select sid,SERIAL#,final_blocking_session as blocking_session,SECONDS_IN_WAIT,(select sql_text from gv$sqltext where sql_id = A.sql_id) as exec_sql,(select sql_text from gv$sqltext where sql_id = A.prev_sql_id) as prev_sql,inst_id,username,TERMINAL,program from gv$session A where sid in (select session_id from gv$locked_object)
--top 20 sql
SELECT round(100 * a.pct,2) pct,round(a.elapsed_time / 1000000,2) elapsed_time,round(a.elapsed_time / a.executions / 1000000) second_by_exec,round(a.cpu_time / 1000000,2) cpu_time,round(a.buffer_gets / a.executions) avg_gets,round(a.DISK_READS / a.executions) avg_reads,a.executions as executions,s.sql_text FROM ( SELECT * FROM ( SELECT elapsed_time,ratio_to_report(elapsed_time) OVER () pct,cpu_time,buffer_gets,disk_reads,executions,address,hash_value FROM v$sql ORDER BY elapsed_time DESC ) WHERE rownum < 20 ) a,v$sqlarea s WHERE a.address = s.address AND a.hash_value = s.hash_value AND a.executions <> 0 ORDER BY pct DESC,cpu_time DESC