我尝试了3种不同的方法将多个(超过500行)插入到SQLite表中。与直觉相反,下面的方法3是最快的。我会假设方法2是最快的,因为它使用"准备好的"声明句柄。但我的第三种方法 - 一次插入500行(500显然是SQLite允许的最大值) - 速度更快。
我错过了什么吗?我应该继续使用500方法,还是有其他方法?
注意:下面的代码不是我的实际代码,我只是为了示例目的在这里编写它并且尚未经过测试。
use strict;
use warnings;
use DBI;
my $dsn = "DBI:SQLite:dbname=db";
my $dbh = DBI->connect($dsn,"","");
open my $data_file,"<","data.txt"; # 3 integer fields per line
APPROACH_1:
while (<$data_file>) {
my @fields = split "\t";
my $insert = join ",", @fields;
$dbh->do("insert into table values ($insert)";
}
APPROACH_2:
my $sql = "insert into table values (?,?,?)";
my $sth = $dbh->prepare($sql);
while (<$data_file>) {
my @fields = split "\t";
$sth->execute(@fields);
}
APPROACH_3:
my @inserts;
while (<$data_file>) {
my @fields = split "\t";
my $insert = '('.join(",",@fields).')';
push @inserts, $insert;
if (@inserts == 500) {
my $insert_500 = join ",", @inserts;
$dbh->do("insert into table values $insert_500";
undef @inserts;
}
}
# insert leftovers
答案 0 :(得分:4)
请参阅下面的示例,其中autocommit设置为0
communicator.rb
这将禁用提交,直到插入所有记录。在实践中,如果有大量插入内容,您可能不想等待提交 - 可能每5000个插入或任何您认为最好的插入。通过不提交,如果出现错误或计算机关闭,那么您将只在最后一次提交时创建记录数 - 这是一个困难的情况。