我设置了一个测试用例来将行写入数据库。每个事务插入10,000行,没有更新。每个步骤花费的时间比上一个步骤线性增加。前十个步骤执行提交所需的毫秒数如下:
568、772、942、1247、1717、1906、2268、2797、2922、3816、3945。
当它添加10,000行到500,000行的表时,需要37149毫秒才能提交!
以下是一些其他设置:
- setAutocommit(false) - PRAGMA page_size = 4096 - PRAGMA journal_size_limit = 104857600 - PRAGMA count_changes = OFF - PRAGMA cache_size = 10000
我没有外键约束。使用WAL可以提高性能(上面给出了数据),但还是会有线性下降。PRAGMA Synchronous=OFF没有效果。PRAGMA locking_mode=EXCLUSIVE没有效果。运行时没有额外的索引和额外的索引。产生了大致相同的时间差异,因此仍然是线性下降。完整模式如下(我已经运行了有索引和无索引的情况,但已经包含)。
568、772、942、1247、1717、1906、2268、2797、2922、3816、3945。
当它添加10,000行到500,000行的表时,需要37149毫秒才能提交!
以下是一些其他设置:
- setAutocommit(false) - PRAGMA page_size = 4096 - PRAGMA journal_size_limit = 104857600 - PRAGMA count_changes = OFF - PRAGMA cache_size = 10000
我没有外键约束。使用WAL可以提高性能(上面给出了数据),但还是会有线性下降。PRAGMA Synchronous=OFF没有效果。PRAGMA locking_mode=EXCLUSIVE没有效果。运行时没有额外的索引和额外的索引。产生了大致相同的时间差异,因此仍然是线性下降。完整模式如下(我已经运行了有索引和无索引的情况,但已经包含)。
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