和session相关的主要视图v$session->v$session_wait
v$session 视图记录了当前连接
Session 的信息,这些信息包括用户名、连接主机、Session正在执行的SQL的SQL_ADDRESS、SQL_HASH_VALUE等,非常详尽。v$session_wait则记录了当前连接session正在等待的资源信息。在Oracle 10g中,Oracle将v$session_wait视图的内容合并入v$session视图,使得对于当前session信息的获取更加简便。
通过这两个视图,可以快速得到当前连接 session 的状态,如果数据库正在经历诸如等待、竞争、锁定等问题,通过这两个视图就可以找到性能问题的原因,以及正在导致这些问题的session。
和Session级统计信息相关的视图v$sesstat->v$sysstat
v$sesstat视图记录了session的统计信息,这些统计信息包括诸如session的逻辑数据读取、物理数据读取、排序操作等。v$sesstat收集的信息同时会累积进入v$sysstat视图,v$sysstat视图记录的是整个数据库系统的统计信息。
通过v$sesstat可以对当前连接运行的session信息进行获取和分析,通过v$sysstat则可以对数据库启动以来的运行状况获得整体印象。
和等待事件相关的主要视图v$session_event->v$system_event
v$session_event记录了当前连接session的等待事件,这些信息最终被累积进入v$system_event视图,v$system_event 记录的是整个数据库系统自数据库启动以来的等待信息汇总。通过这两个视图,可以了解到数据库的等待消耗在哪些事件上,从而可以进一步的诊断其具体问题。
这里需要对 v$session_wait 和 v$session_event 视图进行一点区别和说明。v$session_event视图记录当前连接session的等待事件信息,这些等待事件是session生命周期内的各种等待事件的累计,比如查询当前session的累积等待:
select * from v$session_event where sid =
(select sid from v$mystat where rownum <2);
该视图记录不同等待事件的等待时间、等待次数等信息。
而 v$session_wait 记录的是活动 session 当前正在等待的资源信息,是实时信息的记录, v$session_wait 的实时等待结束之后才能被记入
v$session_event。简单粗略一点来描述, v$session_wait是“现在”,v$session_event是“曾经”:
当然v$session_wait和v$session_event不仅仅是“现在”和“曾经”这么简单,v$session_wait视图记录的信息更为复杂和全面,在这个视图中,Oracle通过额外的参数(P1、P2、P3)将等待事件具体等待的资源等信息呈现出来,对于不同的事件,这3个参数具有不同的含义,比如对于db file scattered read等待,P1就代表文件号,P2代表数据块号,P3则代表块数(P代表Parameter)。
select * from v$event_name where name='db file scattered read';
可以注意到,在Oracle 9i中,v$session和v$session_wait的信息并没有被Statspack收集,而v$system_event视图记录的又是累积信息,这也就意味着我们不能对session的历史进行追踪,也就无法得知一个等待是哪一个session如何以及何时引发的,针对这一情况,Oracle 10g中开始增强,在下一节中我们会详细介绍Oracle 10g的变化。
最后列举一下:
(1)v$session +
v$session_wait = Oracle10g v$session;
(2)v$sysstat;
(3)v$system_event;
(4)v$process;
(5)v$sql;
(6)v$sqltext;
(7)v$lock;
(8)v$latch_children;
(9)v$bh。
除了数据库等待、统计信息等,我还关心进程信息( v$process )、闩(v$latch_children)竞争信息、锁(v$lock)等待信息、SQL(v$sql、v$sqltext)信息、Buffer信息(v$bh),当然还有很多重要视图值得关注,但是如果只能列出9个视图?你会怎样排列呢?




