1.V$SESSION中的常用列
V$SESSION是基础信息视图,用于找寻用户SID或SADDR,及检查用户的动态:
(1)SQL_HASH_VALUE,SQL_ADDRESS
这两列用于鉴别默认被session执行的SQL语句,如果为null或0,那就说明这个session没有执行任何SQL语句;
(2)PREV_HASH_VALUE和PREV_ADDRESS
此两列用来鉴别被session执行的上一条语句。
(3)STATUS 用来判断session状态
① Achtive:正执行SQL语句(waiting for/using a resource)
② Inactive:等待操作(即等待需要执行的SQL语句)
③ Killed:被标注为删除
2.Session信息
(1)SID:SESSION标识,常用于连接其他列
(2)SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个 SESSION结束,另一个SESSION开始并使用了同一个SID)。
(3) AUDSID:审查session ID唯一性,确认它通常也用于当寻找并行查询模式
(4)USERNAME:当前session在oracle中的用户名。
3.Client信息
数据库session被一个数据库服务器上或中间服务器及SQL*Net连接到数据库的客户端进程启动,以下各列提供这个客户端的信息
(1)OSUSER: 客户端操作系统用户名
(2)MACHINE:客户端执行的机器
(3)TERMINAL:客户端运行的终端
(4)PROCESS:客户端进程的ID
(5) PROGRAM:客户端执行的客户端程序
4.Application信息
调用DBMS_APPLICATION_INFO包以设置一些信息区分用户。这将显示下列各列。
(1)CLIENT_INFO:DBMS_APPLICATION_INFO中设置
(2) ACTION:DBMS_APPLICATION_INFO中设置
(3)MODULE:DBMS_APPLICATION_INFO中设置
5.示例
①查找你的session信息
SELECT
SID, OSUSER, USERNAME, MACHINE, PROCESS
FROM V$SESSION
WHERE audsid = userenv('SESSIONID');
②当machine已知的情况下查找session
SELECT
SID, OSUSER, USERNAME, MACHINE, TERMINAL
FROM V$SESSION
WHERE terminal ='pts/tl' AND machine ='seedb';
③ 查找当前被某个指定session正在运行的sql语句。假设sessionID为1000
select
b.sql_text
from
v$session a,
v$sqlarea b
where
a.sql_hash_value=b.hash_value and a.sid=1000
④ sid,serial#
通过sid查询与这个session相关的各种统计信息:
(1) 查询用户相关的各种统计信息.
SELECT
a.sid,
a.statistic#,
b.name,
a.value
FROM
v$sesstat a,
v$statname b
WHERE
a.statistic# = b.statistic#
AND a.sid = :sid;
(2)查询用户相关的各种io统计信息.
select
*
from
v$sess_io
where
sid = :sid;
(3)查询用户正在打开着的游标变量
select
*
from
v$open_cursor
where
sid = :sid;
(4)查询用户当前的等待信息. 以查看当前的语句为什么这么慢/在等待什么资源.
select
*
from
v$session_wait
where sid = :sid ;
(5)查询用户在一段时间内所等待的各种事件的信息. 以了解这个session所遇到的瓶颈
select
*
from
v$session_event
where
sid = :sid;
(6)kill当前session的时候可以通过sid,serial#来处理
alter system kill session ':sid,:serail#';
(7)paddr.字段, process addr
通过这个字段我们可以查看当前进程的相关信息, 系统进程id,操作系统用户信息等
SELECT
a.pid,
a.spid,
b.name,
b.description,
a.latchwait,
a.latchspin,
a.pga_used_mem,
a.pga_alloc_mem,
a.pga_freeable_mem,
a.pga_max_mem
FROM
v$process a,
v$bgprocess b
WHERE
a.addr = b.paddr(+)
AND a.addr = :paddr
(8). taddr 当前事务的地址,
可以通过这个字段查看当前session正在执行的事务信息, 使用的回滚段信息等
SELECT
b.name rollname, a.*
FROM
v$transaction a,
v$rollname b
WHERE a.xidusn = b.usn
AND a.addr = '585EC18C';
(9)lockwait字段,
可以通过这个字段查询出当前正在等待的锁的相关信息.
SELECT *
FROM v$lock
WHERE
(id1, id2) = (SELECT id1, id2 FROM v$lock WHERE kaddr = '57C68C48')
(10)(sql_address,sql_hash_value) (prev_sql_addr,prev_hash_value)
根据这两组字段, 我们可以查询到当前session正在执行的sql语句的详细信息.
SELECT *
FROM v$sqltext
WHERE address = :sql_address
AND hash_value = :sql_hash_value;
(11)ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
可以通过这几个字段查询现在正在被锁的表的相关信息
a. 首先得到被锁的的信息
SELECT
*
FROM
dba_objects
WHERE
object_id = :row_wait_obj#;
b. 根据row_wait_file#可以找出对应的文件的信息.
SELECT
*
FROM
v$datafile
WHERE
file# = :row_wait_file#.
- 在根据以上四个字段构造出被锁的字段的rowid信息.
C. 在根据以上四个字段构造出被锁的字段的rowid信息
SELECT
dbms_rowid.ROWID_CREATE(1,
:row_wait_obj#,
:row_wait_file#,
:row_wait_block#,
:row_wait_row#)
FROM dual;