Oracle Session&Process

一. 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
posted @ 2018-05-16 16:00  Xuty  阅读(942)  评论(0编辑  收藏  举报