--========================
-- Sql Trace
--========================
一、用户进程跟踪文件
用户跟踪文件在根据需要跟踪会话实际操作的时候根据要求产生
通常用于帮助调整应用程序,比如检查由SQL的不良写法所致的相关问题等等
由用户进程发出,服务器进程产生该类文件
包含跟踪SQL命令的统计信息、包含用户的错误信息
缺省情况下当用户出现会话错误时产生
位置由user_dump_dest设定
文件大小由max_dump_file_size 决定
可以设定记录会话的所有信息
分为基于会话级别和基于实例级别,大多数情况下,在session级别进行跟踪
二、不同级别的跟踪
instance level:
alter system set sql_trace = true;
session level:
使用alter session命令启用跟踪
alter session set sql_trace = true;
使用dbms包来启用跟踪
dbms_system.SET_SQL_TRACE_IN_SESSION
三:
10053 trace跟踪文件
可以通过alter session set event 来创建,但是前提是这条SQL被真正执行过。
常见创建方法:
alter session set tracefile_identifier='mytrace';
alter session set events '10053 trace name context forever';
select * from emp where ename='scott';
alter session set events '10053 trace name context off';
到了11g 对于10053有了优化,所以以上创建方法还可以是:
alter session set tracefile_identifier='mytrace'; 创建trace标识符
alter session set events 'trace [sql_compiler.*]';
select * from emp where name='scott';
alter session set events 'trace [sql_compiler.*] off'; 退出10053 trace.
但是有的场景是不允许你执行sql的,比如sql是修改数据的,或者sql很大对性能有影响,或者没有执行权限。这个时候我们可以使用dbms_sqldiag.dump_trace来实现,具体方法如下:
begin
dbms_sqldoag.dump_trace(p_sql_id=>'',
p_child_number=>0,
p_component=>'compiler',
p_file_id=>'mytrace');
end;
/
但是注意的是每次执行 dbms_sqldoag.dump_trace都会触发一此硬解析,因此不能再繁忙期或者频繁的执行。
方法1:10046事件
可以明确显示目标SQL的实际执行中每一个执行步骤所消耗的逻辑度,物理度和花费时间
激活10046事件:
alter session set events '10046 trace name content forever,level 12'
或
oradebug event 10046 trace name context forevel,level 12
在此session中执行sql
得到trace 文件路径
oradebug tracefile_name
关闭10046事件
alter session set events ' 10046 trace name context off'
或
oradebug event 10046 trace name context off