0

テーブルに多数のエントリを挿入する小さな Perl スクリプトを作成しました。
サンプル スニペット:

$query = "insert into big_table (first_name, last_name) values (?, ?) ";

# prepare your statement for connecting to the database
$statement = $connection->prepare($query);

for(my $i = 1; $ i <= 70000; i++) {  
    my $first = "test".$i;  
    my $last = "test".$i;   
    $statement->execute($first, $last);   
}  

行を挿入し、約15分かかりました

しかし、私がこれをしたとき:

CREATE TABLE big_table2 like big_table;  
INSERT INTO big_table2 SELECT * FROM big_table;  

たったの55秒!70000行の場合
なぜこんなに大きな違いがあるのでしょうか?

4

3 に答える 3

6

ループを介した挿入を高速化するには、トランザクションで試すことができます:

AutoCommit=>0接続に属性を追加 します。

my $connection = DBI->connect($dsn,$username,$password, AutoCommit=>0); # transaction enabled

次に、 for ループの後、単一のアトミック操作ですべての変更をコミットできます。

$connection->commit();

あなたが気づいたパフォーマンスの違いは、for ループで実行するいくつかの操作で推定できます。クエリを実行してディスクに 70000 回書き込みますが、他のクエリではすべてのレコードを 1 回だけ...

于 2013-08-14T20:42:39.453 に答える
3

おそらく、スクリプトがディスクに 70,000 回書き込む必要があるのに対し、INSERT SELECT はディスク I/O を最小限に抑えるためです。

さらに、次のように SQL を単純化できます: [テーブル選択構文の作成]

create table big_table2 select * from big_table;

SQL スクリプトでできることを Perl スクリプトで書く必要はないと思います。

于 2013-08-14T20:38:24.200 に答える