20个常用的动态性能视图

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:1123

20个常用的动态性能视图
(1)v$sysstat
(2)v$sesstat
(3)v$sql & v$sql_plan
(4)v$sqltext & v$sqlarea
(5)v$session
(6)v$session_wait & v$session_event
(7)v$process
(8)v$lock & v$locked_object
(9)v$filestat
(10)v$session_longops
(11)v$latch & v$latch_children
(12)v$db_object_cache
(13)v$open_cursor
(14)v$parameter & v$system_parameter
(15)v$rollstat
(16)v$rowcache
(17)v$segstat & v$segment_statistics
(18)v$system_event
(19)v$undostat
(20)v$waitstat

1 V$SQL
V$SQL视图是一个DBA使用频率非常高的动态视图,它通常和V$SESSION一起使用来获得当前会话的一些SQL执行情况。可以通过该视图查看正在执行的SQL语句及这条SQL运行了多长时间或者它正在等待什么样的事件。
a 用V$SQL 查看SQL内容
为了获取用户连接到数据库中的信息,需要先从V$SESSION视图确定用户的SID号,然后用v$session 和 v$sql查看相关信息。
SQL> select SID ,USERNAME,MACHINE,TERMINAL,PROGRAM from v$session where username is not null;
从这里确定根据machine列和program列确定SID。
查看会话sid:select sid from v$mystat where rownum=1;

根据SID确定SQL:
SELECT a.sql_text,b.status,b.last_call_et,b.event
FROM v$sql a,v$session b
WHERE a.sql_id = b.sql_id AND b.sid = 136;

b 用V$SQL 查看SQL执行和等待时间
对于已经执行完毕的会话,可以在V$SQL视图中找到它的执行时间和消耗的CPU时间,这些信息对我们分析一些性能上存在问题的SQL有用处。比如对比SQL 消耗的CPU 和执行时间,就可以大致知道SQL语句执行中是否有长时间的等待事件:
SELECT sql_text,cpu_time / (1000 * 1000) t_cpu,TRUNC (elapsed_time / (1000 * 1000)) t_elap,(cpu_time / elapsed_time / (1000 * 1000)) * 100 pct
FROM v$sql
WHERE sql_text LIKE 'insert into %';

共享池中的SQL并不是所有的SQL语句都可以从V$SQL中找到,因为ORACLE会动态地更新共享池的信息,将一些过旧的SQL从共享池中删除,以便于新的SQL语句提供共享池的空间。
可以手动的清空共享池中的信息,SQL语句如下:
SQL>alter system flush shared_pool;

2 V$SQL_SHARED_CURSOR
这个视图存放了SQL在执行过程中游标共享的信息,它能帮助我们分析看起来一样的SQL,为什么没有共享的原因
SQL> show parameter cursor_sharing;
NAME TYPE VALUE
------------------------------------ ----------- ------
cursor_sharing string EXACT

SQL> select parsing_user_id puid,parsing_schema_id psid,sql_text,sql_id,child_address from v$sql where sql_text like 'insert into t%';
PUID PSID SQL_TEXT SQL_ID CHILD_AD
---------- ---------- ------------------------------ ------------- --------
0 0 insert into tabpart$ (obj#, da 9hp6m1g7j275b A21042D8
0 0 insert into tab$(obj#,ts#,file asnhcg241fr2y A877959C

--- 如果这里有多条SQL_TEXT,SQL_ID相同的,就说明SQL没有重用。 我们可以用如下SQL来确定是哪里不一致造成:
查看不能重用原因:
SQL> select * from v$sql_shared_cursor where sql_id='asnhcg241fr2y';
SQL_ID ADDRESS CHILD_AD CHILD_NUMBER U S O O S L F E B P I S T A B D L T B I I R L I O E M U T N F A I T D L D B P C S C P T M B M R O P M F L P L A F L R L H P B
------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
asnhcg241fr2y A8779678 A877959C 0 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N
如果这里有Y,就是导致不能重用的原因, 这些字母和V$SQL_SHARED_CURSOR 每个字段对应。

3 V$SESSION
从该视图查看用户会话的信息。可以使用machine或者module找到我们的用户。Macine 是客户端机器的名称,userName是会话连接时提供的用户名,Program是客户端执行程序的名称,module是Oracle 的存储过程DBMS_ALLPLCATION_INFO.SET_MODULE给出的执行程序的名称。
这种直接查询v$session视图的方法只适合哪种两层结构的C-S架构,这种是客户端直接连接到数据库。 但是现在基本都是三层架构。 通过中间件如weblogic来连接数据库。 这种情况下就需要在中间件服务上进行跟踪,比如获得用户道和中间件的连接信息,然后根据中间件的信息或者日志来确定用户的最终信息。

V$SESSION常用来查看用户当前的状态,当前执行的SQL语句,SQL语句执行时间,以及等待事件等。
V$SESSION里面有个字段last_call_et(单位:秒),表示执行时间,这里有两种状态:
Session 处于active 状态,该字段表示session变成active到现在的时间;
Session处于inactive状态, 此时表示session 变成inactive到现在的时间。

示例1:查询active的session:
SQL> select status,last_call_et,event from v$session where sid=23;
STATUS LAST_CALL_ET EVENT
-------- ------------ --------------------------------------------
INACTIVE 9976 SQL*Net message from client
这里的9976 表示的从session变成inactive到现在的秒数。

示例2:查询inactive的session:
SELECT a.sql_text,b.status,b.last_call_et,b.event
FROM v$sql a, v$session b
WHERE a.sql_id = b.sql_id AND b.sid = '279';
注意:
在RAC 状态下,会话需要来自不同的实例,所以在RAC 环境下需要使用GV$SESSION视图, 因为这个视图含有INST_ID 字段,通过这个字段可以区别实例。

4 V$SESSTAT
这个视图记录了某个session从运行以来各种资源统计数据,通过关联表v$statname 可以查询出某个session的资源消耗情况,如:
SELECT a.sid,b.name,a.VALUE
FROM v$sesstat a,v$statname b
WHERE a.sid = 23 AND a.statistic# = b.statistic# AND b.name IN ('consistent gets','physical reads','parse count (total)','parse count (hard)');
这里显示了SID=23的session的信息。

5 V$SESSION_WAIT
V$SESSION_WAIT记录了会话的一些等待信息,这些等待信息在v$session视图里可以可以查到。
SELECT event,p1,p1text,p2,p2text,p3,p3text,wait_time,seconds_in_wait,state
FROM v$session_wait
WHERE sid = 23;

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】