Oracle优化10-SQL_TRACE和10046事件-更新中
概述当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起来就好好像卡在什么地方一样,该如何入手呢? 是不是恨不得钻进去看下到底发生了什么? 好在Oracle提供了我们这样的一种方法使用SQL_TRACE来跟踪SQL的执行情况,通过SQLTRACE我们可以很容易的知道当前正在执行的SQL正在干什么。 以下操作基于Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production SQL_TRACESQL_TRACE命令会将SQL的执行过程输出到一个TRACE文件中,我们通过阅读这个TRACE文件就可以了解到在这个SQL执行的过程中,oracle究竟做了哪些事情。 如何开启SQL_TRACE#设置sql_trace生成的文件标识,便于查找
SQL> alter session set tracefile_identifier='mytest';
Session altered
#对当前的会话开启sql_trace
SQL> alter session set sql_trace=true;
Session altered
SQL> 执行具体的sql
#关闭当前会话的sql_trace
SQL> alter session set sql_trace=false;
SQL_TRACE生成的文件在哪个目录下呢?开启SQL跟踪后,会生成一个trace文件,通过初始化参数user_dump_dest配置其所在目录,该参数的值可以通过下面方法获取到: select name,value from v$parameter where name = 'user_dump_dest'
oracle@entel2:[/oracle]$cd /oracle/diag/rdbms/cc/cc/trace
oracle@entel2:[/oracle/diag/rdbms/cc/cc/trace]$ls *mytest*
cc_ora_305_mytest.trc cc_ora_305_mytest.trm
cc_ora_305_mytest.trc 就是我们的trace文件。 扩展: 11g中新增的trm文件
不指定文件标识时,如何查找呢?如果我们没有指定标识时,改如何快速查找对应的trace文件呢? trace文件的名字是独立于版本和平台的,在大部分常见的平台下,命名结构如下: {instance name}_{process name}_{process id}.trc
知道当前会话的sid 便可以查找到 比如下面这种情况 通过如下sql select s.SID,s.SERVER,lower(case when s.SERVER in ('DEDICATED','SHARED') then i.INSTANCE_NAME || '_' || nvl(pp.SERVER_NAME,nvl(ss.NAME,'ora')) || '_' || p.SPID || '.trc' else null end) as trace_file_name from v$instance i,v$session s,v$process p,v$px_process pp,v$shared_server ss where s.PADDR = p.ADDR and s.SID = pp.SID(+) and s.PADDR = ss.PADDR(+) and s.TYPE = 'USER' and s.SID = '263' order by s.SID ;
oracle@entel2:[/oracle/diag/rdbms/cc/cc/trace]$ls cc_ora_2642.trc
cc_ora_2642.trc
其他情况的说明
alter system set sql_trace=true;
这样就可以对实例上的全部SQL进行跟踪了,需要注意的是这种方式的代价是非常巨大的,请慎重操作。
SQL> show parameter sql_trace
NAME TYPE VALUE
-------------- ----------- --------------
sql_trace boolean FALSE
alter session set sql_trace=false ;
关闭外,直接退出sql_plus来终止也是可以的,只要关闭了当前会话,会话级别的sql_trace就失效了。 TKPROF工具最原始的trace文件的可读性是比较差的,除非有必要,我们一般都是通过tkprof工具来处理这个trace文件。 TKPROF工具是oracle自带的一个工具,用于处理原始的trace文件,它的主要的作用就是合并汇总trace文件中的一些项,规范化文件的格式,是文件更具有可读性。 TKPROF使用oracle@entel2:[/oracle/diag/rdbms/cc/cc/trace]$tkprof cc_ora_305_mytest.trc mytest.txt
TKPROF: Release 11.2.0.4.0 - Development on Wed Dec 14 18:45:34 2016
Copyright (c) 1982,2011,Oracle and/or its affiliates. All rights reserved.
执行后,会生成mytest.txt文件,阅读更加方便。 TKPROF参数在命令行下直接输入 tkprof,回车,会看到tkprof支持的所有参数 下面重点说一下常用的几个参数 explain=user/passwordConnect to ORACLE and issue EXPLAIN PLAN. 在trace文件中输入SQL的执行计划。 需要注意的是,如果不使用explain,在trace文件中,我们看到的是SQL实际的执行路径。比如: 使用explain,tkprof在trace文件中不但输入sql的实际执行路径,还会生成该SQL的执行计划。 比如: oracle@entel2:[/oracle/diag/rdbms/cc/cc/trace]$tkprof cc_ora_305_mytest.trc mytest_explain.txt explain=cc/xgongjiang
TKPROF: Release 11.2.0.4.0 - Development on Wed Dec 14 19:26:15 2016
Copyright (c) 1982,Oracle and/or its affiliates. All rights reserved.
查看 mytest_explain.txt文件可以看到比上面的多了一个Execution Plan: 上面的信息中,第一部分是SQL的实际执行路径,下面的部分是使用Explain for的方式生成的SQL执行计划。 sys=(yes|no)如果设置为yes,在trace文件中将输出所有SYS用户的操作(也包含用户SQL语句引发的递归SQL),如果为no,则不输出。 默认为yes. 实际上设置为no,trace文件更具有可读性。 oracle@entel2:[/oracle/diag/rdbms/cc/cc/trace]$tkprof cc_ora_305_mytest.trc mytest_explain_sysno.txt explain=cc/xgongjiang sys=no
TKPROF: Release 11.2.0.4.0 - Development on Wed Dec 14 19:47:25 2016
Copyright (c) 1982,Oracle and/or its affiliates. All rights reserved.
左侧为默认yes,右侧为sys=no,可以sys用户的操作被过滤掉,清晰了很多。 aggregate=yes|no10046事件(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |