2014-11-15 Created By BaoXinjian
一、摘要
在性能的穩定數據庫中,所有的job都需要在一定時間內完成
以前在一個銀行系統中,突然某一個job原本在30minutes內完成的,但是在3hours之後,還在運行
排除了數據量大小變化的影響,需要查看該程序的解析計劃是否變更,在穩定的系統中,job對應的explain plan一般通過sqlplan management固定,很少變化
所以需要查看,是否job對應的sqlplan explain是否變化
一般來說,解析計劃變更也會導致此類問題
二、解決方式
Step1. 查看程序對應的session
select sid, sql_id from v$session where sid = 1001
Step2. 查看對應session目前在運行的sql
select b.begin_interval_time,
a.disk_reads_total,
a.buffer_gets_total,
a.buffer_gets_delta,
a.rows_processed_total,
a.plan_hash_value from dba_hist_sqlstat a, dba_hist_snapshot b where a.snap_id = b.snap_id
and sql_id = '466bpq7055f4c'
order by 1 desc;
Step3. 查看該長時間運行sql對應的解析計劃是否在這段時間有過變更
select* from v$sql_plan
Step4. 查看表的統計時間
select name, last_analized from dba_tables
Step5. 對表進行產生統計信息
exec dbms_stats.gather_table_stats(
ownname=>'SCOT',
tabname=>'GAVIN',
estimate_percent=>3,
degree=>32,
granularity=>'GLOBAL',
cascade=>FALSE,
no_invalidate=>FALSE);
Thanks and Regards