インポートするという処理を作成しています。
現在はAssignFileメソッドでCSVファイルを開き
Readlnメソッドで1行ずつ読み込みながら
TStringListでカンマ区切りに分割し配列に格納し
SQLでINSERTするというようにしています。
ただ、このやり方だと読み込み元のCSVファイルのレコード数が
10万件以上あり、相当な時間がかかってしまうのです。
何か別のやり方でもっと速くインポートできる方法はないでしょうか?
よろしくお願いします。
環境
言語:Delphi 7.0
データベース:DB2/400にBDE接続
OS:Windows2000/XP
DB2のIMPORTコマンドを使用したらどうでしょうか?
直接ファイルを指定してCSVからデータをインポートしてくれます。
IMPORT文の使い方については色々なページで説明されているので確認してみてください。
Ask.jp
URLはダミーです。
トランザクションの単位を1000件に1回コミットの様に書くと、時間は短くなると思います。
例外発生一切無視のコードで書いてしまうと以下のような感じです。
var
ct: Integer;
begin
Database1.StartTransaction;
ct:=0;
while ({ファイルの行数分}) do
begin
{ファイルから1行読み込んでQueryにセットする}
Query1.ExecSQL;
Inc(ct);
if (ct = 1000) then
begin
Database1.Commit;
Database1.StartTransaction;
ct:=0;
end;
end;
Database1.Commit;
end;
1000とかいうマジックナンバーがもろにソース中に書いてありますけど擬似コードということで勘弁してください。
テストしてみてから回答したいところですが、適当なcsvもDBも無いので……。
なるほど。今は毎回コミットしてました。減らすと速くなるんですね。
URLはダミーです。
先ほど回答したIMPORTの件ですが、
詳しく調べてみたところ、LOADを使用すれば、
Clientマシン側のデータも使用できると言う記述が書いているページがありました。
ただ、正確ではないのでDB2のSQLリファレンスなどを確認してみてください。
ありがとうございます。調べてみます。
BDEのテキストドライバを使えば読み込みは早いと思いますが?いかがでしょう?
おー なるほど。そういう回答を待ってました。やってみます。
IMPORTコマンドはDB2側で発行するコマンドですよね?ということはクライアントからCSVファイルをDB2がアクセスできる場所に置く必要がありますよね。
できればクライアントから直接更新したいのですが