2017-09-23 12 views
0

SQLiteに問題があります。すべての呼び出しには300ミリ秒かかります。いくつかのテストの後、私は遅延がトランザクションによって引き起こされていることに気付きました。暗黙のトランザクションで8個の通常のインサートには約2秒かかりますが、挿入前にトランザクションを開始してからコミットすると、同時に約100万個のインサートを実行できます。影響を受けるコールには、DROP TABLE、CREATE TABLE、INSERTなどがあります。他のものも想定しています(おそらくすべて暗黙的にトランザクションを開始します)。SQLite C++ APIトランザクションが遅い

いくつかの詳細:SQLiteのWebサイトからソース合併をダウンロード

  • (3200100)
  • コンパイル、それ私が遊んでてきたが、任意のコンパイラフラグを使用していない(静的ライブラリにVisual Studioを使用私はマルチスレッドを実行を開始しないおよび/または最初の結果
  • を受信するsqlite3_open16その後、sqlite3_prepare16_v3が続くとsqlite3_stepを使用しています
  • )運のない彼らと、複数のプロセスからのアクセス、データベースファイルがexclusではありませんこのプログラムで積極的に開く
  • SSD(960 EVO)でファイルを作成すると、「トランザクションの遅延」が300msから10msに短縮されます。しかし、やはり馬鹿げた高い価値ですが、ディスクの速度がトランザクションを遅くしているものに影響を与えてはいけないと感じていますか?
  • ブロックしている機能は、sqlite3_step(それはまた、私はちょうど例えば、DROP TABLEを実行するためにその名前の関数を呼び出すために持っていることを私に不愉快ではなく、それは重要なこと)
  • 編集です:トランザクション中、 CPU使用率は100%です。

テーブルのすべての行が正確に64バイトであることがわかっている場合は、データを整理してSQLiteを「手助けする」ことができますか?

私はあなたにこれを手伝ったり、代替案を提案したりしたいと思います(リレーショナル、C++ API、ファイルベース、高性能) ありがとう!

+0

DROPおよびCREATE TABLEは、新しいデータベースを作成したり、既存のデータベーススキーマを複雑にアップグレードしたりしない限り、これらの2つのコマンドを実行するのが珍しいため、非常に高価になります。 DROP/CREATEは、データベースのメタデータ(スキーマ)に対しても大幅な変更/チェックを行う必要があります。 INSERTは、テーブルに多数のインデックス/外部キーがある場合を除き、高速でなければなりません。 –

+1

これは[FAQ](http://www.sqlite.org/faq.html#q19)です。非同期で書き込む[WALモード](http://www.sqlite.org/wal.html)の使用を検討してください。 –

答えて

3

SQLiteは、データの破損を防ぐために多くの努力をしています。したがって、暗黙的なトランザクションでは、ハードディスクの速度によって制限されます。トランザクションと

は、データを他の場所に書き込まれ、一度だけディスクにコミット、および

同期をオンにするとsqlite speed

から、はるかに高速ですが、SQLiteは)(FSYNCを実行します重要なデータがディスク・ドライブの表面に実際に書き込まれたことを確実にするために、キーポイントでシステム・コール(または同等のもの)を使用します。

トランザクションを作成するとき、データは他のファイルに書き込まれ、すべてのデータがコミットされた場合にのみ、fsyncコストが支払われます。これは構成のその部分の価格です。これからの肯定的なことは、私はsqliteデータの破損に苦しんだことはありません。

私のディスクの速度がトランザクションを遅くしているものに影響しないように感じますか?

これは重要なトレードオフです。データの完全性を向上させるためには、ディスクの速度が重要です。

はどのくらいのトランザクションがかかりコミットするのでしょうか? sqlite faq :19 why are transactions slow

から

SQLiteは簡単に平均的なデスクトップコンピュータ上の毎秒50,000以上のINSERT文を実行します。しかし、1秒あたり数十回の取引しか行われません。

あなたはすることができます: -

  1. 使用取引はより多くの仕事をバインドします。コストはトランザクションごとであるため、一括して増やすことができます。
  2. 一時テーブルを使用します。テンポラリテーブルはパフォーマンスに影響を与えず、フルスピードで実行されます。
  3. 推奨しません。同期書き込みを無効にするにはPRAGMA synchronous=OFFを使用してください。
+0

ジャーナリングモードをWALに設定することは、(整合性の観点とパフォーマンスの観点から)私が望んだことでした。この値は、通常のハードディスクでは1秒あたり32トランザクション、SSDでは512よりもはるかに意味があります。本当にありがとう、私はFAQのその情報を逃したとは思えません! –

関連する問題