案例----如果我想查询某一个时间点: 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来进行针对关联查询。