2008-10-03 53 views
1

爲了取決於批處理作業運行一天的時間PDQ資源的微調分配,我們有一個工具,它基於周/小時的天規則的某一天設置PDQPRIORITY,如:在SPL中設置PDQ - 本地範圍?

PDQPRIORITY=$(throttle); export PDQPRIORITY 

但是,這在腳本啓動時已修復,因此長時間運行的作業在進行時不會受到限制。爲了改善這種情況,我們已經試過如下:

CREATE PROCEDURE informix.set_pdq() RETURNING VARCHAR(50); 
    DEFINE pdq, dow SMALLINT; 
    DEFINE hr SMALLINT; 

    LET dow = WEEKDAY(CURRENT); 
    LET hr = TO_CHAR(CURRENT, '%H'); 

    IF (dow == 0 OR dow == 6 OR hr < 8 OR hr > 14) THEN 
     LET pdq = 100; 
     SET PDQPRIORITY 100; -- SET PDQ does not accept a variable name arg. 
    ELIF (hr >= 8 AND hr <= 10) THEN 
     LET pdq = 40; 
     SET PDQPRIORITY 40; 
    ELIF (hr >= 11 AND hr <= 12) THEN 
     LET pdq = 60; 
     SET PDQPRIORITY 60; 
    ELIF (hr >= 13 AND hr <= 14) THEN 
     LET pdq = 80; 
     SET PDQPRIORITY 80; 
    END IF; 
    RETURN "PDQPriority set to " || pdq; 
END PROCEDURE; 

在整個SQL不同的時間間隔,我們添加了:

EXECUTE PROCEDURE set_pdq(); 

然而,儘管它不會失敗,的範圍SET PDQ似乎是SPL本地的。 onstat -g mgm不會報告分配的原始資源的任何更改。因此,添加這些調用似乎沒有任何影響 - 在程序啓動時分配的資源保持不變。

代碼嵌入外殼SQL,即:

dbaccess -e $DBNAME << EOSQL 
    SELECT .. INTO TEMP ..; 
    EXECUTE PROCEDURE set_pdq(); 
    SELECT .. INTO TEMP ..; 
    --etc 
EOSQL 

所以反引號或$()內插發生在腳本,當此文件被傳遞給DBACCESS的開始。 (這消除了顯而易見的:SET PDQPRIORITY $(throttle);

哇,這很快羅嗦。任何人都可以提出任何方式來實現這一點,不涉及完全重寫這些批處理作業?由於嚴重依賴臨時表,將SQL分解爲更小的部分不是一種選擇。

回答

1

正如你會從你提出問題的時間和第一次嘗試答案之間的過度推遲中推導出來的,這不是微不足道的。

問題的一部分是,我認爲,在創建存儲過程或更新其統計信息時會捕獲PDQPRIORITY。的確,這可能是所有問題。現在,臨時表導致存儲過程的另一系列問題 - 存儲過程通常需要在涉及臨時表時重新優化(除非SP可能會創建臨時表)。

+0

感謝喬納森 - 在這一點上,我幾乎放棄了獲得迴應。我一直在想,我可能不得不重寫SELECT ... INTO TEMP代碼作爲perl DBI do()調用,這將使我有機會在必要時包裝PDQ。 – RET 2008-10-12 20:03:39