Form_通过Trace分析Concurrent和Form性能和异常详解(案例)
2014-06-21 Created By BaoXinjian
一、摘要
1. 理论概念
(1). 优化器选择方式:基于Rule和基于Cost,在数据库层次进行设定
(2). 执行计划解读:解析 -> 执行 -> 提取
(3). 执行效能解析:每个动作CPU和时间,提取的次数
(4). Trace的4中方式:Trace: 常规的Trace,这种所有里面SQL的变量都被Bind Variable替代,适合性能分析;
Trace With Binds: 带变量值得Trace, 这种Trace的结果中带具体的值,适合问题查询;
Trace With Waits:
Trace With Binds and Waits:
(5). TkProf工具:将trc文件替换成prf文件,整理后比较容易阅读,但是SQL的执行顺序和一些信息会丢失
(6). 最终的Trace文件会呈现具体的SQL语句和每个SQL语句对应的效率如下
2. 并发程式Trace
(1).通过Request中enable trace去启动Trace功能;
i. 产生的是Regular Trace,里面不带参数值
ii.启动方式:调用Request是点击Enable选项
(2).通过Profile去启动单个用户下所有的Trace功能;
i. 产生的是Trace With Binds,带参数
ii.启动方式:a. Request的Trace Enable选项并无启动
b. 修改这个User层级下的Profiler<Initialization SQL Statement - Custom>, 单行格式
begin
fnd_ctl.fnd_sess_ctl('', '','TRUE','TRUE','LOG','ALTER SESSION SET
EVENTS=''10046 TRACE NAME CONTEXT FOREVER, LEVEL 4''
TRACEFILE_IDENTIFIER=''<tar/bug#>''');
end;
iii.重要的参数
LEVEL 4 可被改为LEVEL 8 或者LEVEL 12,其意义分别如下:
Use
LEVEL 4 :以”Trace with Binds” 的方式进行Trace
Use
LEVEL 8 :以”Trace withWaits” 的方式进行Trace
Use
LEVEL 12 :以”Trace with Binds and Waits” 的方式进行Trace
(3).通过SQL去启动所有用户下所有的Trace功能;
i. 产生的Trace With Binds, 带参数
ii.启动方式:a. 调用数据库系统级的Event 10046
b. 需要调用一段特定的SQL<bde_session_event_10046.sql>
c. 产生SQL之后再调用这段SQL,再关闭所有User的Trace
3. Form表单的Trace
(1). 使用诊断功能,启动Form的Trace with binds
(2). 进行具体操作时,其记录会产生至Trace文件中
(3). 产生Trace文件后,关闭Trace with binds
4. 非常重要的注意事项
当trace调试后,必须进行关闭,特别是在PROD环境,不然如果不关闭,User的任何操作系统会一直记录trace,会对服务器造成非常大的负担
之前在项目中就遇到被DBA Team抱怨,所以一个好的习惯非常重要
当然经常运行SQL去查询Concurrent Program是否启动trace选项做个后期预防也重要
二、案例分析 - Concurrent Trace 分析
案例:对Invoice History Report进行Trace分析,了解其执行效率
Step1. 在并发程式设定Enable Trace为True
Step2. 调用该程式,并记录RequestID(5820613),并根据这个ID追踪具体阐述Trace位置
Step3. 执行如下SQL,查询Trace文件名和路径
1 SELECT 'Request id: ' || Request_Id,
2 'Trace id: ' || Oracle_Process_Id,
3 'Trace Flag: ' || Req.Enable_Trace,
4 'Trace Name:'
5 || Dest.VALUE
6 || '/'
7 || LOWER (Dbnm.VALUE)
8 || '_ora_'
9 || Oracle_Process_Id
10 || '_APPS.trc',
11 'Prog. Name: ' || Prog.User_Concurrent_Program_Name,
12 'File Name: '
13 || Execname.Execution_File_Name
14 || Execname.Subroutine_Name,
15 'Status : '
16 || DECODE (Phase_Code, 'R', 'Running')
17 || '-'
18 || DECODE (Status_Code, 'R', 'Normal'),
19 'SID Serial: ' || Ses.Sid || ',' || Ses.Serial#,
20 'Module : ' || Ses.Module
21 FROM Fnd_Concurrent_Requests Req,
22 V$session Ses,
23 V$process Proc,
24 V$parameter Dest,
25 V$parameter Dbnm,
26 Fnd_Concurrent_Programs_Vl Prog,
27 Fnd_Executables Execname
28 WHERE Req.Request_Id = 5820613
29 AND Req.Oracle_Process_Id = Proc.Spid(+)
30 AND Proc.Addr = Ses.Paddr(+)
31 AND Dest.Name = 'user_dump_dest'
32 AND Dbnm.Name = 'db_name'
33 AND Req.Concurrent_Program_Id = Prog.Concurrent_Program_Id
34 AND Req.Program_Application_Id = Prog.Application_Id
35 AND Prog.Application_Id = Execname.Application_Id
36 AND Prog.Executable_Id = Execname.Executable_Id
Step4. 获取Trace文件路径名为
Step5. 通过Tkporf工具将trc文件进行格式转化为prf格式
Step6. 查看prf文件
Step7. 如下即可看到最终的trace分析文件,该文件记录的在运行Request时所使用了那些SQL和对应的效率
三、案例分析 - Form Trace 分析
案例:对标准Invoice Form启动Trace分析
Step1. 启动Trace with Binds
Step2. 在这个过程建立Invoice并保存
Step3. 关闭Trace with Binds
Step4.系统会自动将Trace启动和关闭之间所有业务的操作记录下来保存在Trace文件中
获取路径SQL: SELECT value FROM v$parameter WHERE name = 'user_dump_dest';
注意:所以当调试后,关闭Trace功能非常重要,因为你不关闭trace功能,系统会一直记录操作记录,会对服务器造成很大的负担
Thanks and Regards
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建