大量のデータをキャッシュするアプリケーションにsystem.data.sqliteラッパーを使用しています。このデータのほとんどは3列の1つのテーブルに格納されます。キャッシュからのデータは、Webサービス呼び出しからプルダウンされ、フルデータセットがキャッシュされるまでループ内でデータベースに挿入されます。 Webサービスへの各呼び出しでは、3000レコードがプルダウンされ、1トランザクションでデータベースに挿入されます。SQLiteがバルク挿入時にマシンを遅くする
データベースのサイズが約8MBになると、挿入が遅くなり、各トランザクションのコミット後に2〜3MBのジャーナルファイルが作成されます。これにより、大量のI/Oが発生し、実際にはオペレーティングシステム(Windows XP)がトランザクションコミットで応答しなくなるまで遅くなります。
SQLiteはクラスタードインデックスを使用しないため、データの順序付け方法や挿入時に順序付けされているかどうかはわかりません。データが順序どおりに挿入されていません。
この問題が見つかった場合、これは、本番Webサービスを呼び出すときにのみ発生します。QAのWebサービスは、この大量のジャーナルファイルをすべてのトランザクションコミット(QA約2KB-14KBです)。 Webサービスは、SQLServerデータベースからデータを取得しています。生産とQAの唯一の違いは、QAのデータベースが約1年前の生産のバックアップであることです。キャッシングアルゴリズムは、最も古いデータから始めます。この場合、これらのデータベース(QAとProd)の両方が99%同じである必要があります。
SQLiteはこの大きなジャーナルファイルを作成しますが、これは順序付けされていないデータを挿入しており、ページを分割する必要があるためですか? WALへのアップグレードはこの問題を緩和するでしょうか?
ProdとQAの両方のテーブル構造は同じですか?同じFileversionをSqliteに使用していますか? –
スキーマ、使用しているインデックス、Webサービスからデータを取得する順序、およびキャッシュするレコードの合計数に関する詳細情報を提供してください。 Webサービスから最初にシードするには、メモリ内のデータベースを使用する方が効率的です。 – dwurf