案例----如果我想查詢某一個時間點: 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來進行鍼對關聯查詢。