2015-11-05 43 views
0

我已經嘗試了3種不同的方法將多個(超過500)行插入到SQLite表中。直覺地,下面的方法3是最快的。我會假設方法2將是最快的,因爲它使用「準備好的」語句句柄。但我的第三種方法 - 一次插入500行(500顯然是SQLite允許的最大值) - 速度更快。DBD :: 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

我並不驚訝你的結果。我沒有太多使用SQLite,但至少在MySQL中,超過幾行的批量插入比單獨插入每行要快得多。這是有道理的:每個插入都需要與數據庫交談,這與數據庫有一定的關聯。 – ThisSuitIsBlackNot

+1

此外,對於更多的行,使用DBMS的本地導入功能導入CSV可能會更快(當插入>〜100行時,MySQL的'LOAD DATA INFILE'比我的特定應用程序的批量導入快得多)。 SQLite [有一個CSV導入命令](https://www.sqlite.org/cli.html#csv),但我不確定您是否可以通過DBI使用它。 – ThisSuitIsBlackNot

回答

1

參見在下面的例子中,其中自動提交被設置爲0

#!/usr/bin/perl 
use strict; 
use warnings; 
use DBI; 

my $dbh = DBI->connect("dbi:SQLite:dbname=pedro.lite","","", 
    {PrintError => 1, AutoCommit => 0}) or die "Can't connect"; 

my $sth = $dbh->prepare(q{INSERT INTO purchases VALUES(?,?,?,?)}) 
    or die $dbh->errstr; 

while (<DATA>) { 
    chomp; 
    $sth->execute(split /\|/); 
} 

$dbh->commit() or die $dbh->errstr; 

__DATA__ 
Pedro|groceries|apple|1.42 
Nitin|tobacco|cigarettes|15.00 
Susie|groceries|cereal|5.50 
Susie|groceries|milk|4.75 
Susie|tobacco|cigarettes|15.00 
Susie|fuel|gasoline|44.90 
Pedro|fuel|propane|9.60 

這將禁用提交,直到所有的記錄被插入。在實踐中,如果有很多插入操作,可能不會等待提交 - 也許每隔5000個插入點或任何您感覺最好的插入。如果沒有提交,如果出現錯誤或計算機關閉,那麼您只會在上次提交時創建記錄數 - 這是一個困難的情況。

+0

沒有想過自動提交。將明天再試謝謝。 – beasy

+0

我終於開始測試這個。你是對的。禁用自動提交真的很快。謝謝。 – beasy

+0

@beasy很高興有幫助。很高興解決了你的問題。 –