五、阅读TKPROF格式化的文件
经过TKPROF格式化后的文件内容,就比较容易阅读了,我截取了格式化后的文件中的一段:
********************************************************************************
第一部分为sql语句文本。
第二部分主要反映执行效率,主要关注cpu、disk、query、rows几项insert into audit_result_temp Select nvl(count(distinct file_id), :"SYS_B_0") from (Select file_id from log_collect where standard_flag=:"SYS_B_1" and Billing_cycle_id=:"SYS_B_2" Minus Select file_id from log_import where billing_cycle_id=:"SYS_B_3")
Cpu反映SQL语句的 CPU解析和执行时间
Disk反映磁盘读取情况,可以理解成物理读次数,越小越好。
Query主要是反映查询的中间结果有多少行次,执行了多少次查询。
Rows最终结果返回了多少行
第三部分,是此语句的执行计划,主要关注是否进行了全表扫描。call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 10 0.01 0.00 0 0 0 0 Execute 11 48.26 74.81 0 1477212 398 11 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 21 48.27 74.81 0 1477212 398 11
********************************************************************************Misses in library cache during parse: 1 Optimizer goal: CHOOSE Parsing user id: 22 (recursive depth: 1) Rows Row Source Operation ------- --------------------------------------------------- 2 SORT GROUP BY 0 VIEW 0 MINUS 0 SORT UNIQUE 0 TABLE ACCESS FULL LOG_COLLECT 0 SORT UNIQUE 0 TABLE ACCESS FULL LOG_IMPORT
几种典型情况:
1、 如果query很大,rows很小,就明显有问题,表示运行了很多的中间查询,而最终只返回了很少的行。
2、 Disk读很大。Disk如果很大,要检查下面的执行计划,是否用全表扫描,使用了不正确的索引等。从磁盘读取过多,速度肯定很慢。
3、 CPU时间过大,可能是SQL语句很复杂,或没有使用绑定变量的原因
通过以上过程,就可以对所有的耗CPU时间比较大的进程的SQL进行分析了。