问题描述
嗨,汤姆,
下面是其中一个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
下面是其中一个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次:
但它只需要加载一次语句。因此,此语句的TKPROF显示:
Parse = 1,执行和获取两者 = 100。
总的来说,这是一件好事。硬解析是一个昂贵的过程。所以你想要几个解析大量的执行。这就是你所拥有的。
但这并不一定意味着你的代码是好的!
例如,在您的输出中,该查询处理了来自75,437执行的75,437行。即一行/运行的平均值。这表明你可能有一个循环,75,437迭代,每次获取一行。如果是这种情况,请问自己: 您可以摆脱循环并重写代码以一次性获取所有行吗?
因此,它只需要经历检查语句是否有效并产生一次执行计划的整个过程。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
598次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
579次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
493次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
475次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
460次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
438次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
436次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
424次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
368次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
360次阅读
2025-04-15 14:48:05