(12)使用Window和Window Group |
[君三思] 2009-9-8 |
七、使用Windows此Windows非彼Windows,通常說的Windows是指蓋首富的操作系統,而此處所說的Windows,是指SCHEDULER特性中的一個子項。在SCHEDULER中,WINDOW對應的是一個時間窗口的概念。 我們知道普通的jobs是沒有運行時間管理地概念的,就是說一個job啟動之后,用戶只能被動地等待其執行,一直到其執行地任務完成(或DBA手動kill對應進程),在此期間,執行的job將與其它活動的進程共同競爭當前系統中的資源。對于大型數據庫系統,系統資源那可是相當寶貴的無形資產哪,企能誰說用就用、想什么時候用就什么時候用,沒點兒計劃沒點兒節制這還了得。你還別說,在9i之前,還真就是這么回事兒,誰想用就用,誰也管不了,其中表示最甚的就是job。你是否想起了Job Classes,沒錯定義Job Classes確實可以控制job能夠使用的資源,不過單單使用Job Classes并不能靈活的控制job在合適的時間使用適當的資源。進入10g之后,SCHEDULER中提供了WINDOW,事情終于有了緩解。 WINDOW 可以指定一個時間窗口,在此期間,通過與Job Classes的搭配組合,能夠有效控制job執行時支配(使用)的資源。比如說job通常是在凌晨服務器負載較低時執行,那么就可以通過WINDOW設置在此期間,允許jobs使用更多的系統資源,而到了工作時間后,如果job仍未執行完成,為其分配另一個有限的資源,以盡可能降低job執行占用的資源對其它業務的影響。 1、創建Window創建Window有一個專門的過程:DBMS_SCHEDULER.CREATE_WINDOW進行處理,該過程有兩種調用方式,如下: -- 基于SCHEDULE DBMS_SCHEDULER.CREATE_WINDOW ( window_name IN VARCHAR2, resource_plan IN VARCHAR2, schedule_name IN VARCHAR2, duration IN INTERVAL DAY TO SECOND, window_priority IN VARCHAR2 DEFAULT ¨LOW¨, comments IN VARCHAR2 DEFAULT NULL); -- 基于定義的調度 DBMS_SCHEDULER.CREATE_WINDOW ( window_name IN VARCHAR2, resource_plan IN VARCHAR2, start_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL, repeat_interval IN VARCHAR2, end_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL, duration IN INTERVAL DAY TO SECOND, window_priority IN VARCHAR2 DEFAULT ¨LOW¨, comments IN VARCHAR2 DEFAULT NULL);刨開那些看著眼熟的,已經認識的,看參數名就知道其所代表含義的之外,下列幾個參數可能需要關注:
正如前面CREATE_WINDOW過程語法結構顯示的那樣,調用該過程有兩種方式,差異就在于是指定現有定義好的調度SCHEDULE,還是在執行過程時指定調度,目標和實現的功能都是相同的,這里僅做示例,咱就挑個最復雜的方式吧,執行過程時指定調度,執行腳本如下: SQL> begin 2 dbms_scheduler.create_window(window_name => ¨my_first_wd1¨, 3 resource_plan => null, 4 start_date => sysdate, 5 repeat_interval => ¨FREQ=DAILY; INTERVAL=5¨, 6 duration => interval ¨1¨ hour); 7 end; 8 / PL/SQL procedure successfully completed.查詢當前擁有的WINDOW,可以通過*_SCHEDULER_WINDOWS視圖(注意只有DBA和ALL,沒有USER,因為所有定義的WINDOW都屬于SYS用戶)。除了*_SCHEDULER_WINDOWS視圖顯示當前所有WINDOW外,還有:
2、管理Window通過前面那些SCHEDULER對象的學習,相當大家已經了解了ORACLE SCHEDULER中對象的特點,對于多數對象的管理,不外乎下列幾種:
SQL> exec dbms_scheduler.set_attribute(¨sys.my_first_wd1¨,¨start_date¨,sysdate+1); PL/SQL procedure successfully completed.
SQL> exec dbms_scheduler.enable(¨sys.my_first_wd1¨); PL/SQL procedure successfully completed.
SQL> exec dbms_scheduler.disable(¨sys.my_first_wd1¨); PL/SQL procedure successfully completed.
SQL> exec dbms_scheduler.drop_window(¨sys.my_first_wd1¨); PL/SQL procedure successfully completed.除此之外呢,對于WINDOW對象來說,由于其特殊作用,又有:
注意WINDOW是依賴于其調度的,因此在手動打開WINDOW時,必須為其指定duration屬性: SQL> exec dbms_scheduler.open_window(¨sys.my_first_wd1¨,interval ¨1¨ hour);; PL/SQL procedure successfully completed.
SQL> exec dbms_scheduler.close_window(¨sys.my_first_wd1¨); PL/SQL procedure successfully completed.關閉和打開WINDOW,都會記錄日志,大家可以通過*_SCHEDULER_WINDOW_LOG視圖中獲取這部分信息。 3、關于WINDOW GROUP除了WINDOW外,還有一個與WINDOW有關系的叫WINDOW GROUP,一個WINDOW GROUP可能包 含多個WINDOW。使用WINDOW GROUP的本意是這樣的,假如說某個job執行的時間比較長,甚至全天24小時都在執行,對于這類job,單個WINDOW很難有效調整其資源占用,這時間呢,就可以通過設置一個WINDOW GROUP,該WINDOW GROUP中包含了多個WINDOW,每個WINDOW分別負責不同時間點時的資源使用計劃。 然后在創建JOB時,指定schedule_name參數為WINDOW GROUP的名稱(想不到SCHEDULE_NAME還能指定為WINDOW GROUP哪,其實何止WINDOW GROUP,還可以直接指定成WINDOW哪),這樣,就可以通過很簡單的方式,將job與window聯系在一起了。 WINDOW GROUP 的創建和管理與前面介紹的方式極其相似:
這些過程的調用方式也都非常簡單,這里就不著重演示了,感興趣的朋友不妨自行嘗試。 |