テーブルと2つの整数で構成されるプライマリキーを持つSqlite3データベースがあり、それに多くのデータを挿入しようとしています(つまり約1GB程度)Sqlite3:挿入中に主キーインデックスを無効にしますか?
問題はプライマリキーを作成すると暗黙的にインデックスが作成されます。私の場合は、コミット後にクロールに挿入されることがありません(データベースファイルがNFS上にあるためです)。sigh)。
だから、一時的にそのインデックスを無効にしたいと思います。私の最善の計画はこれまで主キーの自動インデックスを削除することでしたが、SQLiteはそれを気に入らず、エラーが発生したようです。
2番目に良い計画は、ネットワークドライブ上のデータベースの透過コピーを作成し、変更してから元に戻すというアプリケーションに関係します。ほとんどのSQlite/NFSに関する質問とは対照的に、私はアクセスの同時性は必要ありません。
このようなことを行う正しい方法は何でしょうか?
UPDATE:私はしかし、すべての次の、バッチでアイテムを挿入し、実際にいる :
PRAGMA synchronous = OFF
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
PRAGMA temp_store = MEMORY
UPDATE 2:
は私がすでに使用しているフラグを指定するのを忘れバッチは以前のものよりもコミットが遅くなります(私はこれがインデックスのサイズと関係していると仮定しています)。私は10kから50kのタプルをバッチ処理しようとしました。各タプルは2つの整数と浮動小数点数です。
1つのINSERT cache_sizeパラメータをチェックすると、このトリックを行うように見えます。キャッシュが明らかに多いほど、より多くのアイテムを一度に挿入できます。結局のところ、すべての終わりにコミットすることができるようにも見えます。 –
さて、できます。しかし、O(1)の挿入操作の主な手口は、そのインデックスでソートされたデータを埋め込むことですが、データがメモリキャッシュに収まる場合は、すべてが本当に高速です。コミットサイズをキャッシュサイズより小さくすることは妥当です。そうしないと、sqliteは強制的にディスク上に移動します。 – Mash