SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。
1.通过putty 或其他主机工具进入数据库所在主机.
2.在命令行中通过sqlplus登录oracle.
???连接数据库命令:sqlplus username/password
3.使用SQL_TRACE分析sql语句.
SQL_TRACE可以作为初始化参数在全局启用,也可以通过命令行方式在具体session启用。(以下案例均在session下进行)
?1).在全局启用?
?在参数文件(pfile/spfile)中指定:
?sql_trace =true
在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用,这个参数在10g之后是动态参数,可以随时调整,在某些诊断中非常有效。
提示: 通过在全局启用sql_trace,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰的看到各个进程之间的紧密协调.
所以不建议使用以上方式
?2).在当前session级设置
?大多数时候我们使用sql_trace跟踪当前进程.通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效),
?研究SQL执行,发现后台错误等.
启用当前session的跟踪: SQL>?alter?session?set?sql_trace=true; Session?altered. 此时的SQL操作将被跟踪: SQL>?select?count(*)?from?dba_users;--此sql语句可被更换成需要跟踪分析的sql. ??COUNT(*) ---------- ????????34 结束跟踪: SQL>?alter?session?set?sql_trace=false; Session?altered.
或者使用?DBMS_SESSION程序包?来开启或关闭sql_trace
SQL> exec DBMS_SESSION.SET_SQL_TRACE (sql_trace boolean);
? ?
一般放seesion追踪的信息,对应系统初始化参数文件参数show?parameter?user_dump???--11g之前使用user_dump_dest 对应的就是它的位置。 SQL>?show?parameter?user_dump?--查看session中trace文件的存放位置 NAME?????????????????????????????????TYPE??????????????????????????????VALUE ------------------------------------?---------------------------------?------------------------------ user_dump_dest???????????????????????string????????????????????????????/oracle/diag/rdbms/templatedb/ ??????????????????????????????????????????????????????????????????????????????????????templatedb/trace ?? ??SQL>?show?parameter?trace?--查看trace在当前session中的相关参数的值,sql_trace的值会随着trace的开启与关闭发生变化,如下为仅为验证过程. NAME?????????????????????????????????TYPE??????????????????????????????VALUE ------------------------------------?---------------------------------?------------------------------ log_archive_trace????????????????????integer???????????????????????????0 sec_protocol_error_trace_action??????string????????????????????????????TRACE sql_trace????????????????????????????boolean???????????????????????????FALSE trace_enabled????????????????????????boolean???????????????????????????TRUE tracefile_identifier?????????????????string SQL>?alter?session?set?sql_trace=TRUE; Session?altered. SQL>?show?parameter?trace NAME?????????????????????????????????TYPE??????????????????????????????VALUE ------------------------------------?---------------------------------?------------------------------ log_archive_trace????????????????????integer???????????????????????????0 sec_protocol_error_trace_action??????string????????????????????????????TRACE sql_trace????????????????????????????boolean???????????????????????????TRUE trace_enabled????????????????????????boolean???????????????????????????TRUE tracefile_identifier?????????????????string SQL>?select?value?from?v$diag_info?where?name=‘Default?Trace?File‘;--查看当前session默认的trace文件url VALUE -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- /oracle/diag/rdbms/templatedb/templatedb/trace/templatedb_ora_5581.trc --设置自定义标识符,也可以不设置,设置后的则会改变当前session文件名末尾的字符串?如:templatedb_ora_5581.trc?变为?templatedb_ora_5581_testsession.trc,如下所示 SQL>?alter?session?set?tracefile_identifier=‘testsession‘; Session?altered. SQL>?select?value?from?v$diag_info?where?name=‘Default?Trace?File‘; VALUE -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- /oracle/diag/rdbms/templatedb/templatedb/trace/templatedb_ora_5581_testsession.trc
5 退出sqlplus
使用exit命令即可退出.
6 根据刚才设置的标示符可以很容易的锁定当前session所涉及的trace文件
[[email protected] trace]$ ll *test*
-rw-r----- 1 oracle oinstall 2780 Dec 11 11:41 templatedb_ora_10420_testsession.trc
-rw-r----- 1 oracle oinstall? 136 Dec 11 11:41 templatedb_ora_10420_testsession.trm
7?使用Oracle自带的一个命令行工具tkprof,将trace文件生成一个易读的文本文件
[[email protected] trace]$ tkprof templatedb_ora_10420_testsession.trc testsession.txt
[[email protected] trace]$ ll *test*
-rw-r----- 1 oracle oinstall 2780 Dec 11 11:41 templatedb_ora_10420_testsession.trc
-rw-r----- 1 oracle oinstall? 136 Dec 11 11:41 templatedb_ora_10420_testsession.trm
-rw-r--r-- 1 oracle oinstall 5605 Dec 11 11:44 testsession.txt
cat?testsession.txt TKPROF:?Release?11.2.0.4.0?-?Development?on?Mon?Dec?11?11:44:46?2017 Copyright?(c)?1982,?2011,?Oracle?and/or?its?affiliates.??All?rights?reserved. Trace?file:?templatedb_ora_10420_testsession.trc Sort?options:?default ******************************************************************************** count????=?number?of?times?OCI?procedure?was?executed cpu??????=?cpu?time?in?seconds?executing elapsed??=?elapsed?time?in?seconds?executing disk?????=?number?of?physical?reads?of?buffers?from?disk query????=?number?of?buffers?gotten?for?consistent?read current??=?number?of?buffers?gotten?in?current?mode?(usually?for?update) rows?????=?number?of?rows?processed?by?the?fetch?or?execute?call ******************************************************************************** SQL?ID:?61yfbh3s7h5x1?Plan?Hash:?2596900044 select?count(1)?from?test_random_04 call?????count???????cpu????elapsed???????disk??????query????current????????rows -------?------??--------?----------?----------?----------?----------??---------- Parse????????1??????0.00???????0.00??????????0??????????0??????????0???????????0 Execute??????1??????0.00???????0.00??????????0??????????0??????????0???????????0 Fetch????????2??????0.10???????0.10??????????0???????2769??????????0???????????1 -------?------??--------?----------?----------?----------?----------??---------- total????????4??????0.10???????0.10??????????0???????2769??????????0???????????1 Misses?in?library?cache?during?parse:?0 Optimizer?mode:?ALL_ROWS Parsing?user?id:?62 Number?of?plan?statistics?captured:?1 Rows?(1st)?Rows?(avg)?Rows?(max)??Row?Source?Operation ----------?----------?----------??--------------------------------------------------- ?????????1??????????1??????????1??SORT?AGGREGATE?(cr=2769?pr=0?pw=0?time=102729?us) ????999999?????999999?????999999???TABLE?ACCESS?FULL?TEST_RANDOM_04?(cr=2769?pr=0?pw=0?time=192830?us?cost=762?size=0?card=999999) ********************************************************************************
oracle性能优化:如何读懂tkprof
CALL?:每次SQL语句的处理都分成以下三个部分
??Parse:这步将SQL语句转换成执行计划,包括检查是否有正确的授权和所需要用到的表、列以及其他引用到的对象是否存在。
??Execute:这步是真正的由Oracle来执行语句。对于insert、update、delete操作,这步会修改数据,对于select操作,这步就只是确定选择的记录。
??Fetch:返回查询语句中所获得的记录,这步只有select语句会被执行。?
COUNT:这个语句被parse、execute、fetch的次数。?
CPU:这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。
ELAPSED:这个语句所有消耗在parse、execute、fetch的总的时间。
DISK:从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
QUERY:在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。一致性模式的buffer是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。?
CURRENT: 在current模式下所获得的buffer的数量。一般在current模式下执行insert、update、delete操作都会获取 buffer。在current模式下如果在高速缓存区发现有新的缓存足够给当前的事务使用,则这些buffer都会被读入了缓存区中。?
ROWS: 所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返回记录是在fetch这步,对于insert、update、delete操作,返回记录则是在execute这步。
?
A、query+current/rows 平均每行所需的block数,太大的话(超过20)SQL语句效率太低
B、Parse count/Execute count parse count应尽量接近1,如果太高的话,SQL会进行不必要的reparse
C、rows Fetch/Fetch Fetch Array的大小,太小的话就没有充分利用批量Fetch的功能,增加了数据在客户端和服务器之间的往返次数。
D、disk/query+current 磁盘IO所占逻辑IO的比例,太大的话有可能是db_buffer_size过小(也跟SQL的具体特性有关)
E、elapsed/cpu 太大表示执行过程中花费了大量的时间等待某种资源
F、cpu Or elapsed 太大表示执行时间过长,或消耗了了大量的CPU时间,应该考虑优化
G、执行计划中的Rows 表示在该处理阶段所访问的行数,要尽量减少