递归调用(Recursive Calls)这一统计数据并不直接反映当前语句的性能。但是,在我们对语句进行调优过程中,不能忽视该数据。它反映了在执行该语句时,Oracle 还执行了多次对其他语句或内部过程的调用,并且,这些调用同时会导致其他性能统计数据相应增加。因此,当我们在以其他 性能统计数据(例如逻辑读次数)作为调优参考数值时,需要尽量避免递归调用导致的性能数据的 不确定。当无法避免时,则需要考虑递归调用对当前语句的性能影响。
递归调用有可能是由于系统的内部规则或过程所产生的,也可能是由于用户对象所产生的。包 括但不限于以下情况:
• 硬解析语句执行计划;
• 执行 DDL 语句;
• 触发器被激活;
• 在语句中执行了用户自定义函数;
• 在修改表数据时对外键关系做完整性检查;
• 存在位图关联索引时,修改引用表数据时,需要维护索引;
• 递归调用语句导致再次递归调用;
通常来说,大多数的用户递归调用是无法被规避的,此时,我们就需要借助 SQL_TRACE 跟踪
(或者 10046 事件跟踪)来鉴别目标语句和递归调用语句所产生的性能数据:
可以看到,Oracle 递归调用了 4 条内部语句用于对位图关联索引的维护。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。