代码之家  ›  专栏  ›  技术社区  ›  RET

在spl-local范围内设置pdq?

  •  1
  • RET  · 技术社区  · 16 年前

    为了根据批处理作业运行的时间对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分解成更小的部分。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jonathan Leffler    16 年前

    正如你将从你问问题和第一次尝试回答之间的过度延迟中推断出的那样,这不是小事。

    部分问题是,我认为,pdqpriority是在创建存储过程或更新其统计信息时捕获的。事实上,这可能是所有的问题。现在,临时表会导致存储过程出现另一组问题—当涉及临时表时,存储过程通常需要重新优化(除非,可能的话,sp本身创建了临时表)。