所有
[说明]:我正在读取平面文件列表并生成和加载访问数据库。 Windows XP,Perl 5.8.8,无法访问默认安装之外的其他模块。
[问题]:效果,效果,效果。加载所有数据需要大约20分钟。我假设可能有更好的方法来加载数据而不是addnew&更新
[逻辑]:这里没有发布我的很多转换和其他逻辑是我正在尝试的:
谢谢。
答案 0 :(得分:2)
慢速加载中的一个问题是对每次更新进行提交。确保自动提交已关闭,并且每1000行或其他任何一行执行一次。如果它不是一个巨大的负荷,不要做它们。此外,请勿在加载期间创建索引,然后再创建索引。
另外,我不确定OLE是最好的方法。我使用DBI和Win32 :: ODBC一直加载Access db。快得快。
每个请求,这里是示例加载程序,在WinXP,Access 2003,ActiveState Perl 5.8.8上每分钟做大约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;