我有一个测试设置来将行写入数据库。每个事务插入 10,000 行,没有更新。每一步都比最后一步花费更长的线性时间。前十步执行提交的时间如下(以毫秒为单位)
568、772、942、1247、1717、1906、2268、2797、2922、3816、3945
到将 10,00 行添加到 500,000 行的表时,提交需要 37149 毫秒!
我没有外键约束。
我发现使用 WAL 可以提高性能(给出上图),但仍然是线性退化
PRAGMA Synchronous=OFF 无效
PRAGMAlocking_mode=EXCLUSIVE 无效
在没有附加索引和附加索引的情况下运行。产生了大致恒定的时间差,因此仍然是线性退化。
我还有其他一些设置
- 设置自动提交(假)
- PRAGMA page_size = 4096
- PRAGMA journal_size_limit = 104857600
- PRAGMA count_changes = 关闭
- PRAGMA 缓存大小 = 10000
- Schema 有 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