Oracle存储过程副本未修改却执行更快的原因咨询
执行计划绑定差异:原存储过程可能被绑定了低效的执行计划(比如通过Stored Outlines、SQL Profile或SQL Plan Baseline),即使重建,这些绑定规则依然生效,导致执行计划无法优化。而副本没有这些绑定,编译时会根据当前统计信息生成最优计划。
统计信息时效性差异:原存储过程创建或上次编译时,依赖的表、索引等对象的统计信息过时,生成了低效执行计划。创建副本时,这些对象的统计信息已更新,副本编译时基于新统计信息生成了高效计划。重建原过程若未同步更新依赖对象的统计信息,仍会复用旧计划。
编译环境参数差异:原存储过程创建时的PL/SQL优化级别(
PLSQL_OPTIMIZE_LEVEL)、优化器模式(OPTIMIZER_MODE)等环境参数与当前默认值不同。比如原过程用了RULE优化模式,副本用了ALL_ROWS,导致执行逻辑的优化程度有差异。可通过查询USER_PROCEDURES视图对比两个过程的PLSQL_OPTIMIZE_LEVEL值。共享池缓存残留问题:原存储过程的低效执行计划在共享池中被缓存,重建过程时若未清理缓存(比如未执行
ALTER SYSTEM FLUSH SHARED_POOL),Oracle可能继续复用旧计划。而副本是全新对象,会生成并缓存新的执行计划。绑定变量窥视的影响:原存储过程首次执行时的参数触发了绑定变量窥视,生成了针对该参数的专属低效计划,后续执行复用此计划。副本首次执行时,即使参数相同,可能因统计信息更新或窥视机制的上下文变化,生成了更适配的高效计划。
权限与依赖对象状态差异:原存储过程所有者的权限(比如对某些表的访问权限、索引的使用权限)与副本所有者不同,导致执行时无法使用最优路径。或者原过程依赖的对象(如视图、触发器)在创建后发生了状态变化,而重建时未重新验证依赖关系,导致执行效率下降。
内容的提问来源于stack exchange,提问作者marciel.deg

