暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle TKPROF分析: 解析和执行

askTom 2017-02-21
258

问题描述

嗨,汤姆,

下面是其中一个sql的执行计划。当我验证查询执行计划时,它正在使用索引范围扫描和索引唯一扫描。

通过查看下面的输出,我们将如何开始分析。
你能建议为什么解析计数 = 1和执行计数是75437的。

调用计数cpu经过磁盘查询当前行
-
解析1 0.00 0.00 0
执行75437 99.38 98.53 0
获取75437 34.42 34.02 0 451618 0 75437
-
总150875 133.81 132.56 0 451618 0 75437

解析期间库缓存中的未命中: 1
执行期间库缓存中的未命中: 1
优化器模式: FIRST_ROWS

专家解答

这意味着Oracle Database (hard) 对查询进行了一次解析,并执行了75,437次。即在会话运行该语句的75k次中,只有在第一次运行时该语句不在共享池中。

因此,它只需要经历检查语句是否有效并产生一次执行计划的整个过程。

http://docs.oracle.com/database/122/CNCPT/sql.htm#CNCPT1741
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2588723819082

例如,此块运行 “select * 从t” 100次:

create table t (
  x int 
);

insert into t values (1);
commit;

alter session set tracefile_identifier = chris;
exec dbms_monitor.session_trace_enable ( );
declare
  v t%rowtype;
begin
  for i in 1 .. 100 loop
    select * into v from t;
  end loop;
end;
/
exec dbms_monitor.session_trace_disable; 
复制


但它只需要加载一次语句。因此,此语句的TKPROF显示:

SELECT *
FROM
 T


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          1          0           0
Execute    100      0.00       0.00          0          0          0           0
Fetch      100      0.00       0.00          0        300          0         100
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      201      0.00       0.00          0        301          0         100
复制


Parse = 1,执行和获取两者 = 100。

总的来说,这是一件好事。硬解析是一个昂贵的过程。所以你想要几个解析大量的执行。这就是你所拥有的。

但这并不一定意味着你的代码是好的!

例如,在您的输出中,该查询处理了来自75,437执行的75,437行。即一行/运行的平均值。这表明你可能有一个循环,75,437迭代,每次获取一行。如果是这种情况,请问自己: 您可以摆脱循环并重写代码以一次性获取所有行吗?
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论