在Oracle数据库中,最常用的产生10053时间的办法就是在会话中设置这个事件,比如运行下面的命令就可以在当前会话中设置10053事件
ALTER SESSION SET events '10053 trace name context forever';
打开这个事件后,要在设置事件的会话中手动执行一下要跟踪的sql语句,使Oracle优化器对语句执行一次硬解析,然后 关闭这个这个事件,用下面的命令
ALTER SESSION SET events '10053 trace name context off';
在会话中设置10053事件后,对会话中所有硬解析的sql语句都会进行跟踪,在不能手动执行要跟踪的sql语句的时候,使用这个事件产生的跟踪文件会包含我们跟踪的sql语句之外的很多其它语句的信息,这个事件产生的信息本来就很多,如果包含了许多其它语句的信息,会给分析带来不必要的麻烦。
针对上面所说的问题,有两个解决的办法。
1 设置优化器跟踪事件
Oracle优化器跟踪事件可以在系统级设置,也可以在会话级设置,这个事件的一个优点可以针对一条sql语句单独设置,可以在系统级设置,也可以在会话级设置,设置后,只要被跟踪的语句产生一次硬解析,执优化器产生执行计划的信息就会被记录下来。比如在会话级设置,下面通过一个简单的例子演示一下。先运行一条sql语句
select count(*) from emp where empno=20;
查询一下这条语句的sql_id
select SQL_ID,sql_text from v$sql where sql_text like '%empno%';
SQL_ID
-------------
SQL_TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
b353kz5s80jqs
select count(*) from emp where empno=20
设置Oracle优化器跟踪事件,产生这条语句的10053事件跟踪文件
ALTER session SET events 'trace[rdbms.SQL_Optimizer.*][sql:b353kz5s80jqs]';
想办法使这条语句重新解析一下后,就可以关闭这个事件了
ALTER SYSTEM SET events 'trace[rdbms.SQL_Optimizer.*][sql:b353kz5s80jqs] off'
在当前会话的默认跟踪文件里可以发现这条sql语句的跟踪信息,同在会话中设置10053事件的效果是相同的。
2 使用dbms_sqldiag.dump_trace存储过程
上面的两种方法需要使要跟踪的语句重新解析一下,使用这个存储过程则完全不用考虑重新解析语句的问题,甚至也不用考虑绑定变量的问题,只需要传入要跟踪的语句的sql_id,这个存储过程会指示优化器对语句进行重新解析,产生跟踪文件。
exec dbms_sqldiag.dump_trace(p_sql_id => 'b353kz5s80jqs',p_child_number => 0,p_component => 'Optimizer',p_file_id => 'test');
p_child_number的值为0是缺省设置,参数p_file_id设置会话跟踪文件的名称,这个存储过程运行后,跟踪信息存在于当前会话的跟踪文件中,这个例子中是下面这个文件
/opt/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_13266_test.trc