最近のアクセス:
For Each コマンドにおける Blocking 節

大量のレコードを更新または削除する必要があり、スループットが問題となる場合には、DBMS へのラウンドトリップを減らすことで解決できることがあります。概要については「データ更新のブロッキング」を参照してください。
最適化された更新/削除、単一レコードの更新/削除、およびブロックの更新/削除の間には重要なパフォーマンスの違いがあります。最適化された更新/削除では、通常はサーバーへのトリップが 1 回のみであるため、最も高いパフォーマンスになります。最もパフォーマンスが悪いのは、通常、レコードごとにサーバーへのラウンドトリップを 2 回行う必要のある、単一レコードの更新/削除です。最適化できない場合は、単一レコードの更新/削除よりもブロックの更新/削除が良いでしょう。

構文

次に示すとおり、For Each グループにおける Blocking 節は For Each コマンド内でのブロッキングの更新または削除を有効にします。NumericExpression は各ブロック内のレコードの数を指定します。
For each
    [ Order ... ]   [ Where ... ]   [ defined by ... ] 
    [ Blocking 数値式 ] 
    ...
   /* Delete コード */ 
   /* Update コード */ 
When None
   /* When none コード*/
EndFor

For each
    Where Att1 < Value1
          Blocking 100
          Att2 = Value2 
    When none 
         msg("...")
EndFor

実装

Blocking 節が指定されている場合、コードジェネレーターは次のようになります:
For each
     Add record to block (Update or delete code)
     NumberOfRecordsUpd += 1 or NumberOfRecordsDel += 1 (dependant of Update or Delete code)
     If NumberOfRecordsUpd = NumericExpression
        Update Record Block 
        NumberOfRecordsUpd = 0
     EndIf
     If NumberOfRecordsDel >= NumericExpression
        Delete Record Block 
        NumberOfRecordsDel = 0
     EndIf
  When none      
     /* ここに When none コードを入力 */
EndFor
  • ブロッキングが指定されており、更新や削除が実行されない場合は、指定は無視されます。
  • ブロックサイズが削除および更新に適用されます。それぞれに異なる数字を指定することはできません。
  • 実装では更新および削除に異なるブロックを使用します。片方が先にいっぱいになる場合があります。たとえば、更新は 5 回行われたが削除は 1 回しか行われていない場合、ブロックサイズが 5 だとすると、更新ブロックはサーバーに送信されますが、削除ブロックは送信されません。
  • グループの範囲内で Commit を実行すると、保留中の更新/削除がすべてサーバーに送信されます。したがって、レコードを処理するたびに Commit コマンドは発行されません。ブロッキングによって、パフォーマンスが影響を受けることはありません。
  • グループの範囲内でロールバックを実行すると、保留がすべてクリアされ、サーバーに送られることはなくなります。









サブページ
Created: 14/09/18 03:16 by Admin Last update: 21/05/20 06:17 by Admin
カテゴリ
Powered by GXwiki 3.0