暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

收集统计信息,执行计划仍未变化

原创 章芋文 2014-12-04
774
在处理一个繁忙的系统时,发现表的统计信息不对,导致SQL走了全表扫,而这个表非常大,从而就出现了大量read by other session等待事件,相关业务基本上无法运行。
后手工收集统计信息,并使用explain plan查看执行计划走了索引,但是SQL执行时仍然走的全表扫。
后来研究发现,在收集统计信息时需要指定no_invalidate为false,默认是true:
true:当收集完统计信息后,收集对象的cursor不会失效(不会产生新的执行计划,子游标)
false:当收集完统计信息后,收集对象的cursor会立即失效(新的执行计划,新的子游标)
也就是在手工收集完后SQL未重新解析,仍然使用的旧的执行计划。
后加no_invalidate重新收集,SQL恢复正常:
[code]dbms_stats.gather_table_stats('OWNER','TABLE_NAME',degree=>10,cascade=> TRUE,no_invalidate=>false);[/code]
其中degree为并行,cascade为级联,也就是把相关索引的统计信息一并收集。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论