大量のレコードを更新、挿入、または削除する必要があり、スループットが問題となる場合には、DBMS へのラウンドトリップを減らすことで解決できることがあります。
データベース更新の操作をブロッキングする (挿入、更新、削除で共通) ことにより、これらをメモリーに格納し、グループとして DBMS に送信します。データベース更新操作のたびに DBMS とやりとりするのではなく、ユーザーが指定した更新操作回数 (N 回) ごとにやりとりを行います。
たとえば、まだ印刷していない請求書すべてを印刷する必要があり、印刷の状態を格納するのに InvoicePrintedFlag が使用されているとします。対応するコードは次のようなものです。このコードは合致するレコードを一度に読み込んで更新します。EndFor に達するたび (逐次) にレコードが DBMS に送信され、DBMS が更新されます。
For each
where InvoicePrintedFlag = 'N'
PrintInvoice.Call( InvoiceNumber )
InvoicePrinterFlag = 'Y'
EndFor
次に示すように Blocking 節を追加すると、サーバーへのラウンドトリップの回数が削減されます。この場合、データベース更新は、EndFor に 100 回達するごとに 1 回のみ送信されます。これは通常、以前のコードよりも迅速です。
For each
where InvoicePrintedFlag = 'N'
Blocking 100
PrintInvoice.Call(InvoiceNumber )
InvoicePrinterFlag = 'Y'
EndFor
次のように、大量のレコードを同じコードで繰り返し挿入する場合も同様です。
For &i = 1 to &j
...
New Blocking 100
Att1 = ...
Att2 = ...
EndNew
EndFor
適用範囲
この節は DB2 には実装されません。
|