0

Delphi 2007を使用してCRBatchMoveを使用して、古いデータベース(MS Access)からMySQLサーバーにテーブルをインポートしようとしています。

プログラムは、ODBC接続を介してレガシーデータベースからデータをフェッチし、TADOTable.SaveToFile()を使用してローカルハードドライブに保存します。プログラムの2番目の部分は、このファイルを別のTADOTableに読み込み、TCRBatchMoveを使用して(DevArtのTMyTableを介して)MySQLサーバーに転送します。このプロセスでは、バッチ移動が何らかの理由で非常に遅いように見えます。

次の試行のデータ量は、それぞれ約120フィールドの約100,000レコードです。ほとんどのフィールドは整数とVARCHARです(それぞれのVARCHARは32文字未満です)。

私が得たパフォーマンスの数値は次のとおりです。

Time taken to bring data to local file over ODBC connection: 17 seconds
Time taken to load data from local file into TADOTable: 3 seconds
Time taken by TCRBatchMove to move data from TADOTable to TMyTable: > 30 minutes

MySQLサーバーは開発マシン(i7-2.8GHz)でローカルに実行されており、それ以外の点ではデータベースは非常にスッキリしています)。

バッチ移動がデータをMySQLサーバーにプッシュするのが非常に遅いのはなぜですか。このタスクをスピードアップする方法はありますか?それとも、これを達成するためのより良い方法はありますか?

4

1 に答える 1

1

本当の答えではありませんが、コメントのスペースが不足しています。

MySQL には次の関数がありload data infile
ます: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

これを使用して、データを挿入するための最速の時間を計ることができます。これにより、MySQL への挿入時間のベースラインが得られ、遅延が MySQL と Delphi のどちらにあるのかを特定できます。TMyTable のソースがある場合は、プロファイラーも使用できます。

もう 1 つのオプションは、ZEOS データ アクセス コンポーネントを
http://sourceforge.net/projects/zeoslib/
からダウンロード することです。使用しているコンポーネントに問題がある場合は、ツールセットを変更すると問題が解決する可能性があります。(ただし、Devart のコンポーネントは通常優れています)。

MySQL 側では、一括挿入の前にインデックスの更新を無効にし、後でインデックスを有効にすることができます。通常はより速く機能するインサートがたくさんある場合。
参照: https://stackoverflow.com/a/9524988/650492

SET autocommit=0; 
SET unique_checks=0; 
SET foreign_key_checks=0;

your insert here

SET autocommit=1; 
SET unique_checks=1; 
SET foreign_key_checks=1;
于 2012-12-19T17:36:13.380 に答える