Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103759844
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-12 13:26:16

   来源:赛迪网技术社区    作者:xl-rao

1. 查询正在执行语句的执行计划(也就是实际语句执行计划)

 

select * from v$sql_plan where hash_value = (select sql_hash_value from v$session where sid = 1111);

其中id和parent_id表示了执行数的结构,数值最大的为最先执行

比如

ID  PARENT_ID    
0 
1 0
2 1
3 2
4 3
5 4
6 3

则执行计划树为

0
              1
              2
              3
           6     4  
                  5

2.如何设置自动跟踪

用system登录

执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建计划表

执行$ORACLE_HOME/sqlplus/admin/plustrce.sql创建plustrace角色

如果想计划表让每个用户都能使用,则

SQL>create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;

如果想让自动跟踪的角色让每个用户都能使用,则

SQL> grant plustrace to public;

通过如下语句开启/停止跟踪

SET AUTOTRACE ON |OFF | ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN

3.如何跟踪自己的会话或者是别人的会话

跟踪自己的会话很简单

Alter session set sql_trace true|false
Or
Exec dbms_session.set_sql_trace(TRUE);

如果跟踪别人的会话,需要调用一个包

exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)

跟踪的信息在user_dump_dest 目录下可以找到或通过如下脚本获得文件名称(适用于Win环境,如果是unix需要做一定修改)

SELECT p1.value||'\'||p2.value||'_ora_'||p.spid||'.ora' filename
FROM
v$process p,
v$session s,
v$parameter p1,
v$parameter p2
WHERE p1.name = 'user_dump_dest'
AND p2.name = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID')

最后,可以通过Tkprof来解析跟踪文件,如

Tkprof 原文件 目标文件 sys=n

4.怎么设置整个数据库系统跟踪

其实文档上的alter system set sql_trace=true是不成功的,但是可以通过设置事件来完成这个工作,作用相等

alter system set events
'10046 trace name context forever,level 1';

如果关闭跟踪,可以用如下语句

alter system set events
'10046 trace name context off';
阅读(163) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~