日期:2014-05-16  浏览次数:20521 次

Oracle 性能相关的几个视图和参数
一.性能视图
         性能视图是Oracle中一些记录数据库性能方面的视图,通过查看这些视图,获得数据库当前或历史上某个时间的性能数据。 它比SQL_TRACE,AWR报告获取数据更及时,便捷。

Oracle 动态性能视图

1.1 V$SQL
         V$SQL 视图是一个DBA 使用频率非常高的动态视图,它通常和V$SESSION 一起使用来获得当前会话的一些SQL执行情况。可以通过该视图查看正在执行的SQL语句及这条SQL运行了多长时间或者它正在等待什么样的事件。

1.1.1 用V$SQL 查看SQL 内容
         为了获取用户连接到数据库中的信息,需要先从V$SESSION视图确定用户的SID号,然后用v$session 和 v$sql查看相关信息。

         SQL>select * from v$session;
         从这里确定根据machine列和program列确定SID。

         根据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 = 23

         也可以根据进程号来查看。具体参考Blog:
                   oracle 实时查询最耗CPU资源的SQL语句
1> 先通过top命令查看产用资源较多的spid号
2>查询当前耗时的会话ID,用户名,sqlID等:
select sid,serial#,machine,username,program,sql_hash_value,sql_id,
       to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('5648612','256523'));

3> 如果上一步sql_id或者 hash_value不为空,则可用v$sqlarea查出当前正在使用的sql
select sql_text
  from v$sqltext_with_newlines
  where hash_value = &hash_value
order by piece;
select * from v$sql where sql_id=''
---CSDN 网友提供的----
SELECT sql_text
  FROM v$sqltext a
WHERE (a.hash_value, a.address) IN
       (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
               DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
          FROM v$session b
         WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
ORDER BY piece ASC

1.1.2 用V$SQL 查看SQL执行和等待时间
对于已经执行完毕的会话,可以在V$SQL视图中找到它的执行时间和消耗的CPU时间,这些信息对我们分析一些性能上存在问题的SQL有用处。比如对比SQL 消耗的CPU 和执行时间,就可以大致知道SQL语句执行中是否有长时间的等待事件:
         /* Formatted on 2010/9/6 13:05:05 (QP5 v5.115.810.9015) */
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 sf select%'

SQL_TEXT                   T_CPU     T_ELAP        PCT
------------------------------         ----------     ----------   ----------
insert into sf select * from u    .312002        0    .000056249
insert into sf select * from u    .296402        0    .000062524

返回如上结果,如果说T_ELAP 时间比较多,而CPU时间比较少,说明这条语句在执行过程中基本处于等待状态。 关于各个等待事件,参考Blog: