低負荷での1つの問題は、すべてのアップデートでコミットしていることです。自動コミットがオフになっていることを確認し、1000行ごとに実行するかどうかを確認します。巨大な荷物でない場合は、まったくやってはいけません。また、ロード中に索引を作成しないでください。後で索引を作成してください。
また、私はOLEがこれを行うための最善の方法であるとは確信していません。私はDBIとWin32 :: ODBCを使ってAccess dbを常時ロードしています。かなり速く進む。
リクエストごとに、サンプルロードプログラムがあり、WinXP、Access 2003、ActiveState Perl 5.8.8で1分あたり約100kレコードでした。
use strict;
use warnings;
use Win32::ODBC;
$| = 1;
my $dsn = "LinkManagerTest";
my $db = new Win32::ODBC($dsn)
or die "Connect to database $dsn failed: " . Win32::ODBC::Error();
my $rows_added = 0;
my $error_code;
while (<>) {
chomp;
print STDERR "." unless $. % 100;
print STDERR " $.\n" unless $. % 5000;
my ($source, $source_link, $url, $site_name) = split /\t/;
my $insert = qq{
insert into Links (
URL,
SiteName,
Source,
SourceLink
)
values (
'$url',
'$site_name',
'$source',
'$source_link'
)
};
$error_code = $db->Sql($insert);
if ($error_code) {
print "\nSQL update failed on line $. with error code $error_code\n";
print "SQL statement:\n$insert\n\n";
print "Error:\n" . $db->Error() . "\n\n";
}
else {
$rows_added++;
}
$db->Transact('SQL_COMMIT') unless $. % 1000;
}
$db->Transact('SQL_COMMIT');
$db->Close();
print "\n";
print "Lines Read: $.\n";
print "Rows Added: $rows_added\n";
exit 0;
20分で読み込まれる行の数はいくつですか?各行にいくつの列(フィールド)がありますか?どのくらいの大きさのバイトが入力ファイルですか?読み込み中にインデックスを作成していますか? –