私は大規模な sqlite3 (3.6.22) データベース (約 1 GB、500 万行) を持っており、1 つの列にインデックスが付けられた単一のテーブルがあります。問題は、通常の INSERT トランザクションを実行する時間が大きく変動することです。一度に約 10000 行を挿入します (もちろん、トランザクションにラップされます)。多くの場合、約 1.5 秒かかりますが、約 5 トランザクションごとに、まったく同じトランザクションが完了するまでに突然数分かかります。私は多くの実験を行いましたが、インデックスがある場合にのみ現象が発生することを発見しました。これにより、インデックスの更新に多くの時間がかかると思われます。
もっと一貫したパフォーマンスが必要です。一部のトランザクションが前のトランザクションの 200 倍の時間が突然かかることを避けることができれば、平均挿入時間は少し高くても問題ありません...どうすればよいですか?
これがスキーマです。blocks.md5 の文字列は常に正確に 32 バイトの長さで、おそらく一意です。Rolling.value 列には、非常に大きな 64 ビット整数が含まれます。
CREATE TABLE blocks (blob char(32) NOT NULL,
offset long NOT NULL,
md5 char(32) NOT NULL,
row_md5 char(32));
CREATE TABLE rolling (value INT NOT NULL);
CREATE INDEX index_md5 ON blocks (md5);
CREATE UNIQUE INDEX index_rolling ON rolling (value);