SQLiteの1秒あたりのINSERTパフォーマンスを向上させる
SQLiteの最適化には注意が必要です。Cアプリケーションの一括挿入のパフォーマンスは、1秒あたり85挿入から1秒あたり96,000挿入を超える場合があります。 背景: SQLiteをデスクトップアプリケーションの一部として使用しています。大量の構成データがXMLファイルに格納されており、アプリケーションが初期化されるときに解析され、SQLiteデータベースにロードされてさらに処理されます。SQLiteは高速であり、特別な構成を必要とせず、データベースは単一のファイルとしてディスクに保存されるため、この状況に最適です。 理論的根拠: 最初は私が見ているパフォーマンスにがっかりしました。SQLiteのパフォーマンスは、データベースの構成方法とAPIの使用方法に応じて(一括挿入と選択の両方で)大きく異なる可能性があることがわかりました。すべてのオプションと手法が何であるかを理解することは簡単なことではなかったので、同じコミュニティのWikiエントリを作成してスタックオーバーフローリーダーと結果を共有し、同じ調査の問題を他の人に知らせるのは賢明だと思いました。 実験:一般的なパフォーマンスのヒント(つまり、「トランザクションを使用する!」)について単に話すのではなく、Cコードを記述して実際にさまざまなオプションの影響を測定するのが最善だと思いました。いくつかの簡単なデータから始めましょう: トロント市の完全な輸送スケジュールの28 MBのタブ区切りテキストファイル(約865,000レコード) 私のテストマシンは、Windows XPを実行する3.60 GHz P4です。 コードは、Visual C ++ 2005で「完全最適化」(/ Ox)付きの「リリース」としてコンパイルされ、高速コード(/ Ot)が優先されます。 私はテストアプリケーションに直接コンパイルされたSQLite "Amalgamation"を使用しています。私がたまたま持っているSQLiteのバージョンは少し古い(3.6.7)ですが、これらの結果は最新のリリースに匹敵すると思われます(そうでない場合はコメントを残してください)。 コードを書いてみましょう! コード:テキストファイルを1行ずつ読み取り、文字列を値に分割し、データをSQLiteデータベースに挿入する単純なCプログラム。この「ベースライン」バージョンのコードでは、データベースが作成されますが、実際にはデータを挿入しません。 /************************************************************* Baseline code to experiment with SQLite performance. Input data is a 28 MB TAB-delimited text file of the complete Toronto Transit System schedule/route info from http://www.toronto.ca/open/datasets/ttc-routes/ **************************************************************/ …