Oracle执行计划之历史回归

案例----如果我想查询某一个时间点: 2018-01-12 9:00--9:12之间,某个RAC节点,某一个SQL的执行计划,如何处理?

DISPLAY_AWR参数只有四种,分别为:sql_id、plan_hash_value、db_id、format,并没有时间与节点inst_id的选项。

DISPLAY_CUSOR有可能遇见sql执行计划被刷出内存的情况。

方法:

1 先通过DBMS_XPLAN.DISPLAY_AWR查看整个AWR中SQL语句的执行计划

---注意这里前提是AWR里要有相关SQL信息

2 查询AWR中具体有几种执行计划

select * from table(dbms_xplan.display_awr(db_id=>'',sql_id=> ''))
---where plan_table_output like ('Plan hash value%');

此步已经可以具体通过执行计划查阅问题,找出有问题的执行计划。

3 依据时间查看 SNAP_ID

select dbid,snap_id,instance_number,begin_interval_time,end_interval_time
from dba_hist_snapshot where begin_interval_time >=to_date('2018-01-12 09:00:00', 'yyyy-mm-dd hh24:mi:ss') order by begin_interval_time

---匹对对应时间的SNAP_ID

4 根据 2、3步的结果查询出对应时间点SQL的执行计划:

select a.* from (select distinct dbid,sql_id, plan_hash_value from dba_hist_sqlstat
where sql_id = '' and snap_id = xxx and instance_number = 3) b,table(dbms_xplan.display_awr(db_id=> '',sql_id=> b.sql_id,plan_hash_value=> b.plan_hash_value)) a;
----当然在同一个SNAP_ID里也可能查询出多个执行计划,如果是这种情况,就选择有问题的则行

---以不同SNAP中查看同一SQL的运行情况:

select ss.snap_id, ss.instance_number node, begin_interval_time, sql_id, plan_hash_value, nvl(executions_delta,0) execs, (elapsed_time_delta/decode(nvl(executions_delta,0),0,1,executions_delta))/1000000 avg_etime(buffer_gets_delta/decode(nvl(buffer_gets_delta,0),0,1,executions_delta)) avg_lio
from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
where sql_id = ''
and ss.snap_id = S.snap_id
and ss.instance_number = S.instance_number
and executions_delta > 0
order by 1, 2, 3

其实如果想要更精确的定位时间,可以通过DBA_HIST_SNAPSHOT,V$SQLAREA
sql_id,snap_id,time,sql_text来进行针对关联查询。

转载于:https://blog.51cto.com/2012ivan/2125004

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值