サイトアイコン Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Delphi / C++Builderでバッチ処理が遅いなら迷わずFireDACの配列DML

Delphi / C++Builderによって構築されたデータベースアプリケーションでバッチ処理を記述していて、膨大なデータを処理するのに時間がかかっていませんか? そんなときは迷わずFireDACへ移行して、配列DMLを使いましょう。

データベースのバッチ処理

Delphi / C++Builderデータベースアプリケーションで、一括してデータを更新したり、膨大な量のデータを新規に投入するようないわゆる「バッチ処理」と呼ばれるようなデータ操作を行うことがあります。

このようなデータ処理では、一般的にレコード数分のINSERTやUPDATE文をループで繰り返し処理していることでしょう。しかし、このような方法は、アプリケーションのパフォーマンスに大きな影響を与える可能性があります。

例えば、特定のデータベースを用いた1レコードのINSERT処理に250msかかっていたとしましょう。1レコードの挿入操作は、体感的にはほとんど無視できるほどですが、1000レコードの処理を行った場合にはどうでしょう。単純に試算しても、250ms x 1000 = 250 sec(4分強)の時間がかかります。これは無視できる時間ではありませんし、さらにデータが膨大になった場合はどうでしょう。

配列DMLとは

データベース操作において、SQLの発行は相応のコストを伴うものであり、1000レコードの実行に1000回の類似のSQLを発行するのは効率的ではありません。

そこで、発行するSQL文のパラメータに相当する部分を配列として渡し、データベースとクライアント間の通信回数を劇的に減らすことができます。配列DMLは、この配列によるパラメータ渡しをサポートするFireDACでサポートされている機能です。Oracle、MySQL、DB2、Informix、SQL Server、PostgreSQL、Sybase、InterBaseなど主要なデータベースで、配列DMLをネイティブサポートしています。

配列DMLを使う

配列DMLでは、パラメータ配列を用意し、この配列にコマンドごとのパラメータをセットします。例えば、以下のようなSQLの場合、パラメータp1、p2、p3の値がセットされたnレコード分の配列を用意します。

[crayon-676787e6eb221194383556/]

100レコードを配列にセットする場合のコードは以下のようになります。

[crayon-676787e6eb229564259095/]

このクエリーを実行するコードは以下のようになります。

[crayon-676787e6eb22a793132497/]

配列DMLの効果

では、配列DMLを使うと、どの程度のパフォーマンス改善が期待できるのでしょうか。実際のパフォーマンスは、データベースの種類、処理内容、環境などによって異なります。しかし、配列サイズを拡大していくと、一定数までは劇的なパフォーマンス改善効果が得られます。

以下は、Docwikiに掲載されているOracleを使用した例で、最大約2000倍のパフォーマンス効果を発揮しています。

配列DMLの使い方とその効果の詳細については、以下のビデオをご覧ください。

古いデータアクセス方式を使っている方は

現在、BDEやADOなどの古いデータアクセス方式を使っている方は、FireDACへの移行を検討ください。FireDACは、最新のデータベースに対応し、マルチプラットフォーム対応、ハイパフォーマンス、低メンテナンスなど、多くのメリットがあります。BDEやADO、dbExpressなどからの移行ツールも用意されており、比較的容易に、最新のデータアクセス方式へとマイグレーションできるのも魅力です。

配列DMLは、FireDACの高い性能を示すひとつの例に過ぎません。データベースシステムでパフォーマンス問題や安定性など、既存システムに課題を抱えている方は、ぜひ、FireDACへの移行を進めてください。

モバイルバージョンを終了