DBD :: SQLite插入多行的最快方法

时间:2015-11-05 23:13:44

标签: perl sqlite dbi

我尝试了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

1 个答案:

答案 0 :(得分:4)

请参阅下面的示例,其中autocommit设置为0

communicator.rb

这将禁用提交,直到插入所有记录。在实践中,如果有大量插入内容,您可能不想等待提交 - 可能每5000个插入或任何您认为最好的插入。通过不提交,如果出现错误或计算机关闭,那么您将只在最后一次提交时创建记录数 - 这是一个困难的情况。