执行计划缓存是在SQL文本不变的情况下,哪怕收集完统计信息后,优化器做计划时,会生成高效的计划了,但是实际上,我们的语句还是慢。
这是因为,在数据执行SQL文本不变这个SQL时,很久以前(统计信息不对的时候),已经生成过计划了,数据库不会再生成计划了。所以:总是我们看的计划是好的,但是应用在执行时(或者我们执行原先文本严格一致的SQL时),效率也不好。
这个时候我们可以这么处理:
- 等,等之前不好的执行计划被淘汰。这个就比较随缘,也不是建议的方式。这个也是为什么,有时候有的人会说:要过一段时间在生效的原因。
正确的方式如下:
- 我们找到目标SQL的执行计划,通过下面的方式,清空掉这条计划的缓存即可。
--通过这个SQL,我们找到有问题的SQL的执行计划
select * from V$CACHEPLN where sqlstr like '%select act9x0_.BAZ614 as BAZ%'
--获取到对应的 CACHE_ITEM ,把这个 CACHE_ITEM 替换掉下面括号里面的内容,然后执行下面的SQL即可:
CALL SP_CLEAR_PLAN_CACHE(2305843184700604576 );
当然,有时候,在一般的非核心应用系统里面,我们偷懒,也可以这样:
- 为涉及到的表做个ddl,可以是新增索引啥的(表比较小的时候),数据库会自动失效这个表涉及到的所有的计划缓存。
说明:这里大家看出来没,收集统计信息不是DDL操作。
当然,如果清理执行计划还不行,可以考虑择机重启应用;一般不需要如此操作。
文章
阅读量
获赞