1. 前提知道相关的信息 比如sid,serial# 或者sql_id. 我这里只是知道开发给的一个sid,就以此为例子。
相关视图 V$active_session_history ,dba_hist_active_sess_history
由于我这个session已经跑完,而且过了一天才汇报过来,只能选择 dba_hist_active_sess_history这个视图。这里我得到的是sid号为 2398.
select sample_time,user_id,sql_id,session_serial# from dba_hist_active_sess_history where session_id='2398' order by sample_time;
可以根据sample_time来,来找到当时的时间点,进而找到对应的 sql_id.
24-SEP-13 02.16.56.201 AM 80 g1a6hqyarsy0a 7598
24-SEP-13 02.17.06.201 AM 80 g1a6hqyarsy0a 7598
24-SEP-13 02.17.16.211 AM 80 g1a6hqyarsy0a 7598
24-SEP-13 02.17.26.221 AM 80 g1a6hqyarsy0a 7598
24-SEP-13 02.17.36.221 AM 80 g1a6hqyarsy0a 7598
2.根据sql_id来做进一步的查找
select * from table(dbms_xplan.display_cursor('g1a6hqyarsy0a'));或者select sql_text from v$sqltext where sql_id='g1a6hqyarsy0a' order by piece;
这样可以得到原sql语句与其对应执行计划。
3.如果这个语句比以往跑慢了。需要去分析执行计划,比对区别。
相关视图dba_hist_sql_plan
SQL> select distinct dbid,sql_id,PLAN_HASH_VALUE,timestamp from dba_hist_sql_plan where sql_id='g1a6hqyarsy0a' order by timestamp;
DBID SQL_ID PLAN_HASH_VALUE TIMESTAMP
---------- ------------- --------------- ---------
3393184898 g1a6hqyarsy0a 3291279211 04-JAN-11
3393184898 g1a6hqyarsy0a 1944625860 24-SEP-13
这个可以根据不同的hash值来进行每次的执行计划分析。
select * from table(dbms_xplan.DISPLAY_AWR('SQL_ID','HASH','DBID','format'));
format可以参考链接:http://blog.youkuaiyun.com/leshami/article/details/6866870