爲了取決於批處理作業運行一天的時間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分解爲更小的部分不是一種選擇。
感謝喬納森 - 在這一點上,我幾乎放棄了獲得迴應。我一直在想,我可能不得不重寫SELECT ... INTO TEMP代碼作爲perl DBI do()調用,這將使我有機會在必要時包裝PDQ。 – RET 2008-10-12 20:03:39