为了根据批处理作业运行的时间对pdq资源的分配进行微调,我们有一个实用程序,它根据一周中的某一天/一天中的某一小时规则设置pdqpriority,例如:
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
不报告对分配的原始资源的任何更改。所以加上这些
set_pdq()
调用似乎没有任何效果-在程序启动时分配的资源保持不变。
代码是在shell中嵌入的sql,即:
dbaccess -e $DBNAME << EOSQL
SELECT .. INTO TEMP ..;
EXECUTE PROCEDURE set_pdq();
SELECT .. INTO TEMP ..;
--etc
EOSQL
因此,当here文档被传递给dbaccess时,在脚本的开头会出现backticks或$()插值。(这消除了显而易见的:
SET PDQPRIORITY $(throttle);
)
哇,很快就变得很罗嗦了。有没有人能提出任何不涉及完全重写这些批处理作业的实现方法?由于非常依赖临时表,所以不能将sql分解成更小的部分。