そのため、非常に大きなファイルに対してsqliteを使用していくつかのテストを行い、いくつかの結論に達しました(少なくとも私の特定のアプリケーションについて)。
テストには、単一のテーブルまたは複数のテーブルのいずれかを含む単一のsqliteファイルが含まれます。各テーブルには約8列、ほとんどすべての整数、および4つのインデックスがありました。
アイデアは、sqliteファイルが約50GBになるまで十分なデータを挿入することでした。
シングルテーブル
テーブルを1つだけ含む複数の行をsqliteファイルに挿入しようとしました。ファイルが約7GBの場合(申し訳ありませんが、行数を特定することはできません)、挿入に時間がかかりすぎていました。すべてのデータを挿入するテストには24時間程度かかると推定していましたが、48時間後でも完了しませんでした。
これにより、単一の非常に大きなsqliteテーブルには挿入に関する問題があり、おそらく他の操作にも問題があると結論付けました。
テーブルが大きくなり、すべてのインデックスの挿入と更新に時間がかかるため、これは驚くべきことではないと思います。
複数のテーブル
次に、1日あたり1つのテーブルで、いくつかのテーブルにデータを時間で分割してみました。元の1つのテーブルのデータは、約700のテーブルに分割されました。
この設定では挿入に問題はありませんでした。毎日新しいテーブルが作成されるので、時間が経過してもそれほど長くはかかりませんでした。
真空の問題
i_like_caffeineで指摘されているように、VACUUMコマンドは、sqliteファイルが大きくなるほど問題になります。より多くの挿入/削除が行われると、ディスク上のファイルの断片化が悪化するため、目標は定期的にVACUUMを実行してファイルを最適化し、ファイル領域を回復することです。
ただし、ドキュメントで指摘されているように、データベースの完全なコピーはバキュームを行うために作成され、完了するまでに非常に長い時間がかかります。したがって、データベースが小さいほど、この操作は速く終了します。
結論
私の特定のアプリケーションでは、バキュームパフォーマンスと挿入/削除速度の両方を最大限に活用するために、データを複数のdbファイルに分割し、1日に1つにするでしょう。
これはクエリを複雑にしますが、私にとって、これだけのデータにインデックスを付けることができるのは価値のあるトレードオフです。もう1つの利点は、dbファイル全体を削除して、1日分のデータ(アプリケーションの一般的な操作)を削除できることです。
速度が問題になる時期を確認するには、おそらくファイルごとのテーブルサイズも監視する必要があります。
自動バキューム以外にインクリメンタルバキューム法がないように見えるのは残念です。私のバキュームの目標はファイルをデフラグすることです(ファイルスペースはそれほど重要ではありません)。これは、自動バキュームではできません。実際、ドキュメントには断片化が悪化する可能性があると記載されているため、定期的にファイルを完全に掃除する必要があります。