当前位置:文档之家› 20个常用动态性能视图

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,
https://www.doczj.com/doc/8018657025.html,st_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 in

to 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,
https://www.doczj.com/doc/8018657025.html,st_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, https://www.doczj.com/doc/8018657025.html,, a.VALUE
FROM v$sesstat a, v$statname b
WHERE a.sid = 23 AND a.statistic# = b.statistic# AND https://www.doczj.com/doc/8018657025.html, 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;












相关主题
文本预览
相关文档 最新文档