V$SESSION显示每个当前会话的会话信息。
V$SESSION displays session information for each current session.
V$SESSION来自哪些表?
1 查看V$SESSION属于公共同义词。
select * from dba_objects where object_name='V$SESSION';
2 查看V$SESSION同义词的创建语句
select dbms_metadata.get_ddl('SYNONYM','V$SESSION','PUBLIC') from dual;
CREATE OR REPLACE NONEDITIONABLE PUBLIC SYNONYM "V$SESSION" FOR "SYS"."V_$SESSION";
3 V$SESSION同义词来自V_$SESSION视图。
select * from dba_objects where object_name='V_$SESSION';
4 查看v_$session视图创建语句。
select dbms_metadata.get_ddl('VIEW','V_$SESSION','SYS') from dual;
查看v$session属于同义词,来自于视图v_$session,然后查看v_$session视图又来自于v$session?
6 查看V$SESSION定义,V$SESSION来自GV$SESSION。
select * from v$fixed_view_definition where view_name='V$SESSION';
7 查看GV$SESSION定义,语句过长自动截断了,显示不全。
select * from v$fixed_view_definition where view_name='GV$SESSION';
8 搜索关键字ksuseser
select * from v$sqltext_with_newlines where sql_text like '%ksuseser%';
9 通过sql_id查看Sql_text
select sql_id,sql_text from v$sqltext_with_newlines where sql_id='4u5dc0xuutw3f' order by piece;
10 查看v$session最终来自于表x$ksuse , x$ksled, x$kslwt
......
V$SESSION有哪些常用的列:
1 SADDR:session地址
2 SID:会话标识符
3 SERIAL#:会话序列号。用于唯一标识会话的对象。确保在会话结束且另一个会话以相同的会话ID开始时,将会话级命令应用于正确的会话对象。
SID+SERIAL#唯一标识一个会话。
4 PADDR:拥有会话的进程的地址
select * from v$session a inner join v$process b on a.paddr = b.addr;
5 USER#,USERNAME:Oracle 用户标识和用户名,和dba_users表user_id,username关联。
6 COMMAND:正在执行的命令(最后解析的语句)。通过运行这个SQL查询,您可以为这个命令列中返回的任何值n找到命令名:SELECT command_name FROM v$sqlcommand WHERE command_type = n;此命令列中的值为0表示该命令没有记录在V$SESSION中。
SELECT * FROM v$sqlcommand;
......
7 TADDR:事务状态对象的地址,v$session.taddr=v$transaction.addr
例如:
select * from c##cjc.t1;
update c##cjc.t1 set id=11 where id=11;
select * from v$session where taddr is not null;
select * from v$transaction where addr='000000007BDAF0C8';
select prev_sql_id,prev_hash_value from v$session where taddr='000000007BDAF0C8';
select sql_text from v$sql where sql_id='9m7787camwh4m';
begin :id := sys.dbms_transaction.local_transaction_id; end;
为什么update语句在v$sql里显示”begin :id := sys.dbms_transaction.local_transaction_id; end; ”,一般在plsql工具里执行的update会出现这种问题,改成在sqlplus执行update,在v$sql显示正常,如下:
SQL> update c##cjc.t1 set id=100 where id=10;
select sql_text
from v$sql
where sql_id in
(select prev_sql_id
from v$session
where taddr in (select addr from v$transaction));
update c##cjc.t1 set id=100 where id=10
8 PROCESS:操作系统客户端进程ID
select * from v$session;
9 SQL_ADDRESS,SQL_HASH_VALUE,SQL_ID,SQL_CHILD_NUMBER,SQL_EXEC_START,PREV_SQL_ADDR,PREV_HASH_VALUE,PREV_SQL_ID:SQL地址HASH值等。
和v$sql视图的address,hash_value,plan_hash_value等对应。
10 LOGON_TIME:登录时间
11 BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION:产生阻塞的会话
select * from dba_waiters;
12 event#, event, p1, p1raw, p2text, p2raw, p2, p3text, p3, p3raw, wait_class_id, wait_class#, wait_class(等待事件类型), wait_time, seconds_in_wait(等待时长[秒]), state:等待事件相关
select sid,
event#,
event,
p1,
p1raw,
p2text,
p2raw,
p2,
p3text,
p3,
p3raw,
wait_class_id,
wait_class#,
wait_class,
wait_time,
seconds_in_wait,
state
from v$session
where sid in (31, 37);
SELECT NAME, PARAMETER1 P1, PARAMETER2 P2, PARAMETER3 P3
FROM V$EVENT_NAME
WHERE NAME = 'enq: TX - row lock contention';
select type, id1, id2, lmode, request, ctime, block
from v$lock
where sid = 37;
select type, id1, id2, lmode, request, ctime, block
from v$lock
where sid = 31;
更多数据库相关学习资料,可以查看我的ITPUB博客,网名chenoracle:
http://blog.itpub.net/29785807/