签到成功

知道了

CNDBA社区CNDBA社区

oracle DBA 常用的动态性能视图

2016-12-05 14:54 2916 0 原创
作者: Anshen

记住常用的动态性能视图

(1)v$sysstat   


(2)v$sesstat   http://www.cndba.cn/redhat/article/1609


(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  

http://www.cndba.cn/redhat/article/1609


(16)v$rowcache   


(17)v$segstat & v$segment_statistics  


(18)v$system_event 


(19)v$undostat   


(20)v$waitstat 

http://www.cndba.cn/redhat/article/1609



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,http://www.cndba.cn/redhat/article/1609

         (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,为什么没有共享的原因 


http://www.cndba.cn/redhat/article/1609

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语句执行时间,以及等待事件等。http://www.cndba.cn/redhat/article/1609

 

      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


http://www.cndba.cn/redhat/article/1609

-------- ------------ --------------------------------------------


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',http://www.cndba.cn/redhat/article/1609http://www.cndba.cn/redhat/article/1609

                   'physical reads',

                   'parse count (total)',

                   'parse count (hard)');

这里显示了SID=23的session的信息。 



5 V$SESSION_WAIT

http://www.cndba.cn/redhat/article/1609

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;












版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Anshen

Anshen

关注

成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。

  • 66
    原创
  • 0
    翻译
  • 5
    转载
  • 8
    评论
  • 访问:250125次
  • 积分:317
  • 等级:中级会员
  • 排名:第12名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ