大量のレコードを
更新、
挿入、または
削除する必要があり、スループットが問題となる場合には、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
この節は次のプラットフォームではサポートされません:
- Java - DB2 UDB
- .NET - MySQL
- .NET - Informix
- .NET - PostgreSQL
- .NET Core - PostgreSQL