暂无图片
Oracle执行计划改变问题
我来答
分享
豆宇斯
2022-05-27
Oracle执行计划改变问题

有套数据库运行缓慢,重启后恢复正常,我的分析过程如下,麻烦各位大佬帮忙看看是不是有根本原因没找到,还有这个sql的执行计划为什么变化了,谢谢

1.提取故障时间点的awr和ash看到有条全表扫的语句在故障时间段多次执行,怀疑是这条sql导致的





2.提取正常时间段awr看到该sql照样执行了多次,但是未造成性能问题


3.看了下这条sql是很简单的select A from table where B=X这种,表有100多万数据,查看最新执行计划,是走了索引

4.查看dba_hist_sql_plan看到sql的执行计划发生过改变,此前都是走索引,故障时间点开始了全表扫


5.查看dba_indexes中该索引的情况,发现最新统计信息是在重启后



会是统计信息不完整导致执行计划改变的么,还是有其他原因造成这条sql只能全表扫,目前我想到的解决办法是绑定执行计划,但是为什么执行计划会改变还是没有明确

我来答
添加附件
收藏
分享
问题补充
7条回答
默认
最新
杨卓

第一个问题,你需要查询确认你慢的SQL的执行计划,是什么,你的问题没有说清楚2个不同的执行计划,分别走什么,另外就是执行计划的平均执行时间,这个你对sql创建个sqlreport网上搜一下,基本上可以得到报告。

第二个问题,如何分析是不是统计信息收集导致执行计划的改变,https://blog.csdn.net/lihuarongaini/article/details/100983838
参考这个文档,你查下这个表及索引历史收集的情况,在看看时间点是不是匹配的。 如果有问题的时间段统计信息不准,确实很容易出现执行计划改变的情况。

暂无图片 评论
暂无图片 有用 0
打赏 0
暂无图片
豆宇斯
题主
2022-05-27
一个是全表扫,一个是走的索引,故障之前都是走的索引,故障开始变成了全表扫,在重启数据库后又成了走索引
豆宇斯
题主
2022-05-27
sqlreport我先获取下看卡,谢谢大佬
豆宇斯
升级问题到: 潜在风险
暂无图片 评论
暂无图片 有用 0
打赏 0
豆宇斯

AWR里的因果关系一直捋不清,像SQL ordered by Elapsed Time里有几条insert之前执行也很快,但是故障时间点超慢,是全表扫导致的insert慢, 还是insert导致得只能走全表扫,enq: HW - contention这个等待事件也不熟悉,查了下是大量insert导致的HW锁争用,但是执行次数也不多,一小时一个节点才600多次

暂无图片 评论
暂无图片 有用 0
打赏 0
Root__Liu

我说下我的判断哈,不一定准。
1、首先数据库缓慢是整体缓慢,还是部分业务、部分SQL缓慢,如果是整体缓慢,那主要的方向还是在整个数据库层面,就比如你这个出现的GC争用和HW–contention。
2、如果是部分业务或者具体到SQL缓慢,那就主要放在你后面SQL执行计划的分析上。

可以将故障时间段的ash做个dump上传供大家分析。

暂无图片 评论
暂无图片 有用 0
打赏 0
豆宇斯
题主
2022-05-27
整体缓慢
Root__Liu

可以提供下故障时间段的ash dump嘛。

如果保密性或者客户要求严格不允许泄露信息的话,就不要往外发了。

如果可以提供,可以参考下面的方法:

-- 生产环境备份ash源数据
create table SYSTEM.t_ash tablespace sysaux 
  as 
select *
 from  dba_hist_active_sess_history 
  where sample_time >to_date('20220527 09:00:00','yyyymmdd hh24:mi:ss')
  and   sample_time <to_date('20220527 11:00:00','yyyymmdd hh24:mi:ss')
;
  
-- 生产环境导出ash数据
expdp \"\/ as sysdba\" directory=BACKUP tables=SYSTEM.t_ash  dumpfile=ash_dump.dmp logfile=ash_dump.log
复制
暂无图片 评论
暂无图片 有用 0
打赏 0
豆宇斯
题主
2022-05-27
这个不能提供。。
手机用户8432

建议看一下gc有没有关闭,这个热块争用。那个争用那个对象那个sql语句

暂无图片 评论
暂无图片 有用 0
打赏 0
豆宇斯
题主
2022-05-27
重启过了数据库,不知道还能不能找到记录,我去看看,谢谢

从你top10看,存在热块争用和TX锁,可以根据Buffer Busy Waits看下是哪个表或索引,或根据该时间段的ash看下详细描述,然后有些争用时间长的,会被记录到alert报警日志中,报警日志中有记录的,可以根据报警内指定的会话信息找到对应具体是那个块引起的

暂无图片 评论
暂无图片 有用 0
打赏 0
豆宇斯
题主
2022-05-30
alert没有看到具体告警,除了alert还有其他办法定位争用块么
答主
2022-05-31
这是我之前分析时关注的一个blog,你看适不适用你本次的情况。https://blog.csdn.net/cymm_liu/article/details/8220627
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏