暂无图片
分享
杨曾瑞
2021-06-08
SQL执行计划变更

问题描述:
前台人员反馈前台一个模块查询变慢,查询之后原因也很简单,几个SQL的执行计划变了,以前走索引现在走全表扫,收集表的统计信息解决(这个业务只有一个大表,所以几个SQL都是这个表的问题)

但是,10多天后问题再次出现,同样方式解决,又过了10多天问题又复现了,那就要从根源解决了

自己编写了一个SQL查询这个表相关的SQL执行计划变化的时间发现3次问题10多个SQL都是在差不多的时间点发生了执行计划变更
1602314c9d5cd5ed428b1de0913b6e4.jpg

问题:
1.具有绑定变量的SQL在数据库没有重启、也没用刷新缓存的情况下,为什么会发生执行计划变更?

2.SQL比较多,不用绑定执行计划或者添加HINT的方式,还有没有别的好的解决方法

收藏
分享
6条回答
默认
最新
肖杰

绑定变量窥探~到了11g的时候oracle有了自适应游标共享,主要就是为了解决这种数据倾斜的问题~

暂无图片 评论
暂无图片 有用 1
暂无图片
肖杰

先确定执行计划变更的原因是什么,才能解决问题,可以试着从vsql_shared_cursor,vsql的last_load_time列,前后执行计划的cost等等各方面去确定执行计划变更的原因是什么。

暂无图片 评论
暂无图片 有用 0
杨曾瑞

其实原因我是知道的,这是一个被驱动表,当驱动表结果集小时,自然走嵌套循环走索引,当驱动表结果集大时,就会走hash全表扫

其实我想问的是对于绑定变量的SQL什么情况下会让SQL发生执行计划变更,有没有什么机制

暂无图片 评论
暂无图片 有用 0
杨曾瑞

绑定变量窥探应该是第一次硬解析的时候发生是吧,那后面都是软解析啊

暂无图片 评论
暂无图片 有用 0
杨曾瑞

可能就是你说的11g新特性:Oracle自适应游标共享
理解了,谢谢

暂无图片 评论
暂无图片 有用 0
杨曾瑞
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏