2011-08-26 19 views
9

大量のレコードを(数百万で)SQLiteデータベースに挿入しようとしています。データはファイルストリーム(C++)から読み込まれます。単一のトランザクションを開始した場合、すべてのの挿入を実行してからトランザクションをコミットすると、データベースに実際に挿入されたレコードの割合が非常に少なくなります。SQLiteトランザクション数制限?

挿入されているものはランダムに見えます - どのパターンが挿入され、どのパターンが残されているのかわかりません。しかし、私がコミットし、2000年の挿入の後にトランザクションを再開した場合、この問題は発生せず、プロセスはより遅くても挿入されます。したがって...

1つのトランザクション内で実行できる挿入数は厳密に制限されていますか?この制限を変更する方法はありますか?

+1

この問題も同様に発生しました。後世のためにここに投稿してください。これに遭遇した場合は、トランザクションごとに1k-2kの挿入のみをバッチして、これが本当に問題であるかどうかを確認してください。 –

答えて

13

1回のトランザクションで10万行を問題なく挿入できます。

私の推測:

  • あなたは、単一のステートメントでは、あまりにも多くの行を挿入し、式ツリー限度の最大の深さをヒットしています。これは完全にオフにすることができます。
  • 値をバインドせずにSQL文の最大長を指定すると、長すぎるINSERTを使用しています。この場合、パラメータバインディングを使用します。
  • それ(あなたがエラーコードのすべてのAPIリターンをチェックしている?)ライブラリにバグかもしれ

チェックLimits In SQLite。コード内でのINSERTの準備と実行方法を示しておくと役立ちます。

関連する問題