日期:2014-05-16 浏览次数:20679 次
一.性能视图
???????? 性能视图是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
----------