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來進行鍼對關聯查詢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章