馬司系統調優

linyu2012發表於2010-06-30

今天軟開部的CTE約我幫他看看,上次那系統快掛的問題,叫我調優,其實我心裡也很沒底,不過想想這兩年多的學習,也應該可以解決這問題。(之前一直指出上次兩個ORA-00600和ORA-07445錯誤,在系統中連續出現這種錯誤,並從alert_XXX.log中統計下ORA-00600錯誤個數達2807次,並伴隨ORA-07445的個數為1238次,因此係統無人維護造成。兩個錯誤的間隔時間很短,而且都是由SQL語句所引起。由於一直出現有這個錯誤,基本上可以認為問題就是SQL語句。)
查出消耗資源最多的 SQL:
select sql_text,
       hash_value,
       executions,
       buffer_gets,
       disk_reads,
       parse_calls
  from v$sqlarea
 where buffer_gets > 10000000
    or disk_reads > 1000000
 order by buffer_gets + 100 * disk_reads desc;
取出的SQL一個一個解決,基本是讓走規則方法,強制使用/*+RULE*/ /*+HASH()*/和使用INDEX來。
發現意思的是若用RULE,會出來是索引掙資源的情況,一個表多個索引同時在用,會變慢很多。
select  /*+rule */  1,
       a.*,
       b.vessel_name_cn,
       b.voyages,
       to_number(fuc_work_cntr_outnum(A.cntr_no, 2) kem,
       fuc_work_cntr_outnum(A.cntr_no, 3) zmd,
       round(sysdate - DYN_TIME) dcts,
       C.Work_Status,
       D.CLASS_VALUES_NAME,
       (SELECT remark
          FROM T_OPE_VSCH_CNTR c
         WHERE c.VSCHEDULE_ID = a.VSCHEDULE_ID
           AND c.CNTR_NO = a.CNTR_NO
           AND ROWNUM <= 1) AS BZ
  from t_basic_field a,
       t_ope_fore_VSCH b,
       (select Cntr_No, work_status
          from t_ope_strobe_record
         where work_status = '0') C,
       (select CLASS_VALUES_ID, CLASS_VALUES_NAME
          from t_pub_class_values
         where class_id = 15) D
 where a.vschedule_id = b.vschedule_id(+)
   and A.cntr_no is not null
   and a.LOCATION_STATUS = '1'
   and A.Cntr_No = C.Cntr_No(+)
   and A.CON_STATUS = D.CLASS_VALUES_ID(+)
  order by dcts desc, kem desc
本身語句也是多方巢狀造成。
和擷取時間問題上,如
select /*+ RULE */ count(*) A
  from T_OPE_STROBE_RECORD
 where IMP_EXP_TYPE = '3'
   and trunc(IMP_EXP_TIME) = trunc(sysdate)
因要走RULE要進行表分析。
ORACLE9I沒有自動分析功能,編寫一個SQL,定期執行下。
set pages 999999
set linesize 120;
set heading off
set echo off
set feedback off
 
spool /oracle/alog/hotbak/bin/sqltemp.sql;     
select 'analyze table '||owner||'.'||table_name||' estimate statistics sample 5000 rows;'from dba_tables where owner in('XXXX');
select 'analyze index '||owner||'.'||index_name||' compute statistics;' from dba_indexes where owner in('XXXX');
spool off;
 
set echo on
set feedback on
spool /oracle/alog/hotbak/log/analyze.log;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') fromtime from dual;
@/oracle/alog/hotbak/bin/sqltemp.sql;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') totime from dual;
spool off
exit;

經過一天修改,客戶反應速度大大的加快,並無在報ORA-0600和ORA-07445錯誤,定期再跟蹤。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15242702/viewspace-666769/,如需轉載,請註明出處,否則將追究法律責任。

相關文章