Oracle任務排程工具學習

regonly1發表於2012-03-06

沒想到接觸Oracle任務排程工具是從解決Oracle自動統計功能開始的。

      話說從10g開始,cbo便大行其道,oracle更是不遺餘力的在推動這個最佳化器,因為它可以智慧化的生成執行計劃。但是,要實現智慧化,就必須有大量的後臺資料做支撐。這些用來告訴最佳化器如何去生成計劃的資料就是表的統計資訊,包括行數、塊數、基數等各類執行時所需考慮的成本。

      但是,這些智慧化所依賴的資訊是不會自然生成的,也不會在表資料的變化的時候自動告訴最佳化器,我的資料變化了,變化了哪些。所以,Oracle要有一個工具按照一定的時間規則去搜集這些資訊。於是便有了Oracle的自動統計功能,其對應的任務名稱為:GATHER_STATS_JOB。

      該功能是透過dbms_schedule包來實現的,是對資料庫所有的表資訊進行統計和蒐集。

      預設的,在資料庫建立的時候就建立了gather_stats_job,執行dbms_stats.gather_database_stats_job_proc過程,使用schedular。預設的定義了兩個視窗:
weekenight_window定義在下午10點到上午六點.從週一到週五.
weekend_window定義從上午12點到週一12點。

      從這樣的情況來看,執行的時間與我係統的一個批處理時間是重合的,兩個在一起處理的時候都會佔用大量的資源,而導致互相爭奪的情況出現。為了錯開兩個處理時間,必須要將其中一個的觸發點延後,我選擇了自動統計,將其延到凌晨三點,此時批處理已經處理完成,所以可以正常蒐集統計資訊了。

      要做的事情很簡單,兩個步驟:
1、取消原有的計劃模式
call dbms_scheduler.set_attribute('GATHER_STATS_JOB', 'SCHEDULE_NAME', '');

2、啟用新的排程模式(每天凌晨三點開始執行)
call dbms_scheduler.set_attribute('GATHER_STATS_JOB', 'REPEAT_INTERVAL', 'FREQ=DAILY;BYHOUR=3');
      如果需要改為每週執行一次(以下表示在每個星期六的晚上10點執行該計劃),則可以如下:
call dbms_scheduler.set_attribute('GATHER_STATS_JOB', 'REPEAT_INTERVAL', 'FREQ=WEEKLY;BYDAY=SAT;BYHOUR=22');

3、如果該排程沒有啟用,則可以按如下命令啟用:
call dbms_scheduler.enable('GATHER_STATS_JOB');

4、如果需要停止正在執行的中的排程,則可以:
begin dbms_scheduler.stop_job('GATHER_STATS_JOB',true); end;

參考網頁:
http://space.itpub.net/7301064/viewspace-468575
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sched.htm

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

相關文章