1

バッチ ジョブが実行される時間帯に応じて 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()呼び出しを追加しても効果はないようです。プログラムの開始時に割り当てられたリソースは固定されたままです。

コードは、シェルに埋め込まれた SQL です。つまり、次のようになります。

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

そのため、バッククォートまたは $( ) 補間は、ヒア ドキュメントが dbaccess に渡されるスクリプトの開始時に発生します。(それは明らかなものを排除しましたSET PDQPRIORITY $(throttle);:)

うわー、それはすぐに言葉になりました。これらのバッチジョブを完全に書き直すことを伴わない、これを達成する方法を誰か提案できますか? 一時テーブルへの依存度が高いため、SQL を小さな断片に分割することはできません。

4

1 に答える 1

1

質問をしたときから最初に答えを試みたときまでの過度の遅延から推測できるので、これは簡単なことではありません。

問題の一部は、ストアドプロシージャが作成されたとき、またはその統計が更新されたときにPDQPRIORITYがキャプチャされることだと思います。確かに、それがすべての問題かもしれません。現在、一時テーブルはストアドプロシージャで別の一連の問題を引き起こします-一時テーブルが関係する場合、ストアドプロシージャはしばしば再最適化する必要があります(おそらく、SP自体が一時テーブルを作成しない限り)。

于 2008-10-12T02:09:49.423 に答える