Delphi / C++Builderによって構築されたデータベースアプリケーションでバッチ処理を記述していて、膨大なデータを処理するのに時間がかかっていませんか? そんなときは迷わずFireDACへ移行して、配列DMLを使いましょう。
Table of Contents
データベースのバッチ処理
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レコード分の配列を用意します。
1 |
FDQuery1.SQL.Text := 'insert into MyTab values (:p1, :p2, :p3)'; |
100レコードを配列にセットする場合のコードは以下のようになります。
1 2 3 4 5 6 |
FDQuery1.Params.ArraySize := 100; for i := 0 to 100-1 do begin FDQuery1.Params[0].AsIntegers[i] := i; FDQuery1.Params[1].AsStrings[i] := 'qwe'; FDQuery1.Params[2].Clear(i); end; |
このクエリーを実行するコードは以下のようになります。
1 |
FDQuery1.Execute(100, 0); |
配列DMLの効果
では、配列DMLを使うと、どの程度のパフォーマンス改善が期待できるのでしょうか。実際のパフォーマンスは、データベースの種類、処理内容、環境などによって異なります。しかし、配列サイズを拡大していくと、一定数までは劇的なパフォーマンス改善効果が得られます。
以下は、Docwikiに掲載されているOracleを使用した例で、最大約2000倍のパフォーマンス効果を発揮しています。
配列DMLの使い方とその効果の詳細については、以下のビデオをご覧ください。
古いデータアクセス方式を使っている方は
現在、BDEやADOなどの古いデータアクセス方式を使っている方は、FireDACへの移行を検討ください。FireDACは、最新のデータベースに対応し、マルチプラットフォーム対応、ハイパフォーマンス、低メンテナンスなど、多くのメリットがあります。BDEやADO、dbExpressなどからの移行ツールも用意されており、比較的容易に、最新のデータアクセス方式へとマイグレーションできるのも魅力です。
配列DMLは、FireDACの高い性能を示すひとつの例に過ぎません。データベースシステムでパフォーマンス問題や安定性など、既存システムに課題を抱えている方は、ぜひ、FireDACへの移行を進めてください。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition