データベースに行を書き込むためのテストをセットアップしました。各トランザクションは 10,000 行を挿入し、更新はありません。各ステップは、最後のステップよりも長い線形時間がかかります。最初の 10 ステップは、コミットを実行するのに次の時間 (ミリ秒) を要しました
568、772、942、1247、1717、1906、2268、2797、2922、3816、3945
500,000 行のテーブルに 10,00 行を追加するまでに、コミットに 37149 ミリ秒かかります!
外部キー制約はありません。
私はWALを使用してパフォーマンスを向上させていることを発見しました(上記の数値を示します)が、それでも線形劣化
PRAGMA Synchronous=OFF は効果なし
PRAGMA locked_mode=EXCLUSIVE は効果がありません
追加のインデックスと追加のインデックスなしで実行しました。ほぼ一定の時間差を作ったので、依然として直線的な劣化でした。
私が持っている他のいくつかの設定
- setAutocommit(false)
- プラグマ page_size = 4096
- PRAGMA ジャーナルサイズ制限 = 104857600
- PRAGMA count_changes = オフ
- PRAGMA cache_size = 10000
- スキーマには Id INTEGER PRIMARY KEY ASC があり、その挿入はインクリメンタルで、Sqlite によって生成されます
次のように完全なスキーマ(インデックスの有無にかかわらず実行しましたが、含めました)
create table if not exists [EventLog] (
Id INTEGER PRIMARY KEY ASC,
DocumentId TEXT NOT NULL,
Event TEXT NOT NULL,
Content TEXT NOT NULL,
TransactionId TEXT NOT NULL,
Date INTEGER NOT NULL,
User TEXT NOT NULL)
create index if not exists DocumentId ON EventLog (DocumentId)
create index if not exists TransactionId ON EventLog (TransactionId)
create index if not exists Date ON EventLog (Date)
これは、Windows 環境で実行されている sqlite-jdbc-3.7.2 を使用しています。