系统上的某个接口提交数据经常超时(超过3秒),而我单独在后台数据库(Oracle)执行insert,只需要17ms。提交数据的客户端没有任何的调试日志,只能通过跟踪后台语句记录实际调用过程中的数据库执行时间。从而发现问题耗时最多的阶段。
安装dbms_support包
SQL> @?
dbmsadmindbmssupp.sqlSQL> grant execute on dbms_support to test;找到需要跟踪的会话,一个接口可能会建立多个会话,需要根据会话建立的时间来判断真正需要跟踪的会话。
SQL> alter session set nls_date_format="YYYY-MM-DD HH24:MI:SS";SQL> select sid,serial#,logon_time from v$session where username=&name and program=&program;输入 name 的值:"test"输入 program 的值:"test.exe"使用start_trace_in_session进行跟踪
SQL>exec dbms_support.start_trace_in_session(1157,59729,TRUE,TRUE);开始跟踪后,在客户端进行对应的操作。
使用stop_trace_in_session结束跟踪
SQL> exec dbms_support.stop_trace_in_session(1157,59729);使用以下的语句获得trace文件的位置。
SELECTd.VALUE || "" || LOWER (RTRIM (i.INSTANCE, CHR (0))) || "_ora_" || p.spid || ".trc" trace_file_nameFROM (SELECT p.spidFROM v$mystat m, v$session s, v$process p WHERE m.statistic# = 1 AND s.SID = &SID AND p.addr = s.paddr) p, (SELECT t.INSTANCEFROM v$thread t, v$parameter v WHERE v.NAME = "thread" AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i, (SELECT VALUEFROM v$parameter WHERE NAME = "user_dump_dest") d 用文本编辑器可以直接打开trace文件
图中的这一段就是对一个语句的从解析到返回数据的整个过程,如果统计从开始请求到消息返回客户端的时间,直接将红框中的两个tim相减就可以了,
11592216806504-11592199796058=17010446,其单位是1/1000000秒。若要单独获取执行时间,可以EXEC的TIM减掉PARSE的TIM,差值即为执行的时间。其它字段的说明可以参照这个文档。
另外也可以使用TKPROF将trace文件转换成为执行计划解析的文本。
D:apporaclediag
dbmswxmesdbwxmesdb race>tkprof wxmesdb_ora_6520.trc trace_1.txtTKPROF: Release 12.1.0.1.0 - Development on 星期三 1月 6 08:30:11 2016Copyright (c) 1982, 2013, Oracle and/or its affiliates.All rights reserved.如上图所示,可以得到执行时间为17秒,与上一步中通过TIM相减的差值一致。--EOF--
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2016-02/128532p2.htm
| 【内容导航】 |
| 第1页:使用sql trace实现语句追踪 | 第2页:使用10046事件实现语句追踪 |
为啥HBase需要搭建SQL引擎层Oracle 12C RAC的optimizer_adaptive_features造成数据插入超时相关资讯 10046事件 Oracle执行语句跟踪 sql trace
- 如何使用SQL_TRACE和10046事件 (05/26/2015 10:15:27)
- Oracle 10046事件 (03/05/2015 18:56:15)
| - 使用10046事件查看Oracle执行计划 (04/01/2015 20:22:16)
- Oracle 10046跟踪事件操作步骤 (10/07/2013 13:37:07)
|
本文评论 查看全部评论 (0)