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

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:

??? /* Formatted on 2010/9/6 11:08:21 (QP5 v5.115.810.9015) */

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:

????????????????? Oracle 常见的33个等待事件

????????????????????

1.1.3 共享池中的SQL

???????? 并不是所有的SQL语句都可以从V$SQL中找到,因为ORACLE会动态地更新共享池的信息,将一些过旧的SQL从共享池中删除,以便于新的SQL语句提供共享池的空间。

?

???????? 我们可以手动的清空共享池中的信息,SQL语句如下:

?????????????????? SQL>alter system flush shared_pool;

?

我们知道,SQL的解析的过程中,会把硬解析之后的SQL放在放在共享池中,如果我们清空了共享池,那么就需要重新做硬分析。

???????? Oracle SQL的硬解析和软解析

???

?

关于这点的验证,可以参考如下方法:

(1)?????? 开启SQL_TRACE

(2)?????? 做一条事务

(3)?????? 清空缓冲区

(4)?????? 在做同样的事务

(5)?????? 关闭SQL_TRACE

(6)?????? 用tkprof 查看trace文件,生成文件时加上aggregate=no参数,这样如果是一条SQL执行多次,在tkprof的trace文件中会分别列出来。 这个参数默认是YES。

?

Oracle SQL Trace 和 10046 事件

???????? http://blog.csdn.net/tianlesoftware/archive/2010/09/02/5857023.aspx

?

?

1.2 V$SQL_SHARED_CURSOR

???????? 官网链接:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3058.htm#REFRN30254

?

???????? 这个视图存放了SQL在执行过程中游标共享的信息,它能帮助我们分析看起来一样的SQL,为什么没有共享的原因。

?

SQL> show parameter cursor_sharing;

NAME???????????????????????????????? TYPE??????? VALUE

----------