2016-08-20 15 views
1

次のアナログがあります。非常に遅いと思われるINSERTクエリです。 0.037秒(2704.7 Q/100インサート実行pragma synchronous = off; PDO SQLiteの挿入をトランザクションなしで行う方法はありますか?

$sqlite->exec("pragma synchronous = off;"); 

を設定した後23.261秒(4.3 Q/S)

100のインサート実行

$sqlite = new \PDO(); 
for($i=0;$i<100;$i++) { 
    $sqlite->prepare('INSERT INTO test (`id`, `data1`, `data2`) VALUES (:id, :data1, :data2);'); 
    $sqlite->execute(array(
    ':id' => NULL, 
    ':data1' => 'some string', 
    ':data2' = 'some string' 
    // And more 
)); 
} 

s)

  • pragma synchronous = offにはどんな副作用がありますか?
  • 私が理解する限り、ボトルネックはfsyncですよね?
  • クエリをキューに入れるトランザクションを使わずにSQLiteを高速化する方法はありますか?
+0

複数行のSQL文を最初にアセンブルして、最後に一度実行しようとしましたか? – Rasclatt

+0

@Rasclattトランザクション '$ sqlite-> beginTransaction();'と '$ sqlite-> commit();'を使うのと基本的に同じです。ここでは例を簡略化していますが、100件のクエリのすべてがお互いに実行されるわけではありません。 –

答えて

1

documentationは、副作用を文書化:同期OFFと

(0)、SQLiteは、オペレーティング・システムにオフにデータを渡したと直ちに同期することなく継続します。 SQLiteを実行しているアプリケーションがクラッシュした場合、データは安全ですが、オペレーティングシステムがクラッシュしたり、ディスク表面にデータが書き込まれる前にコンピュータの電源が切れた場合、データベースが破損する可能性があります。一方、コミットは、同期オフを使用すると、さらに速くなります。

複数の行をすばやく挿入する唯一の安全な方法は、1回のトランザクションを使用することです。早くやれよ。

+0

私はそれがすべてだと思います。 –

関連する問題