4

トランザクションにいくつかの行を挿入しています。しかし、「END TRANSACTION」を実行すると、実行に約250ミリ秒かかりますが、「BEGINTRANSACTION」は約1ミリ秒かかりません。アプリケーションに合わせて、ここで速度を上げる必要があります。どうやって?

[編集]*単一のスレッドがデータベースにアクセスしています。*このデータベースには2つのテーブルがあり、どちらにも主キーがあります。*トランザクションでは、各テーブルに1つだけ挿入されます。* OS-Windows 7

4

1 に答える 1

7

すぐに使用できる、またはデフォルトのsqliteの設定を使用して、トランザクションをコミットするために250ミリ秒は理にかなっています。これは、sqliteがトランザクションをコミットする方法によるものです。書き込みがディスクにコミットされて戻ることが保証されるまで、VFSを待機します。

最適化する可能性がいくつかあります。

トランザクションごとにより多くの挿入をカプセル化する

可能であれば、トランザクションごとにより多くの挿入を実行します。たとえば、1回のトランザクションで100回の挿入を実行してみて、1回の挿入と比較してわずかな違いがあることを確認してください。何も表示されない場合もあります(つまり、100回の挿入には250ミリ秒以上かかる可能性があります)。

結論としては、各挿入にかかる時間は(平均して)最終的には短くなるため、より多くの利益を得ることができます。

WALジャーナリングを使用する

250ミリ秒から劇的に短縮されるはずなので、WALジャーナリングを試すことを強くお勧めします。WALは、通常のジャーナリングよりも安全性が低いものであってはなりません。WALが高速である理由は、その名前にあります。コミットするたびにデータベースファイルにコミットの変更を吸収させるのではなく、ジャーナリングファイルに追加します。詳細については、これをお読みください。

WALジャーナリングをアクティブにするには、journal_modeプラグマを次のように設定しWALます。

PRAGMA journal_mode = WAL;

同期プラグマを変更する

安全性が低いため、これで十分な場合と不十分な場合があります。そのため、リスクが何であるかを理解している場合、および前の2つの提案が十分でない場合、またはそれらを使用できない場合にのみ、これをお勧めします。

基本的に、synchronous pragmaをNORMALまたはOFFに変更すると、sqliteはVFSの後で、書き込みがディスクにコミットされて戻ることが保証されるのを待たなくなります。

最初にドキュメントを読んでください。それでも試してみたい場合は、プラグマをOFFまたはNORMALに設定できます。

PRAGMA synchronous = NORMAL;

また

PRAGMA synchronous = OFF;
于 2012-04-18T13:39:53.383 に答える