注册
更新统计信息后,计划都一样了,为什么对应的语句还是慢?

更新统计信息后,计划都一样了,为什么对应的语句还是慢?

hql 2021/11/15 2554 7 2
摘要 我们还要正确的清理执行计划。

执行计划缓存是在SQL文本不变的情况下,哪怕收集完统计信息后,优化器做计划时,会生成高效的计划了,但是实际上,我们的语句还是慢。

这是因为,在数据执行SQL文本不变这个SQL时,很久以前(统计信息不对的时候),已经生成过计划了,数据库不会再生成计划了。所以:总是我们看的计划是好的,但是应用在执行时(或者我们执行原先文本严格一致的SQL时),效率也不好。

这个时候我们可以这么处理:

  1. 等,等之前不好的执行计划被淘汰。这个就比较随缘,也不是建议的方式。这个也是为什么,有时候有的人会说:要过一段时间在生效的原因。

正确的方式如下:

  1. 我们找到目标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 );

当然,有时候,在一般的非核心应用系统里面,我们偷懒,也可以这样:

  1. 为涉及到的表做个ddl,可以是新增索引啥的(表比较小的时候),数据库会自动失效这个表涉及到的所有的计划缓存。

说明:这里大家看出来没,收集统计信息不是DDL操作。


当然,如果清理执行计划还不行,可以考虑择机重启应用;一般不需要如此操作。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服